程序报地址错误时,如何定位到异常的代码段
在网上搜索到一种方法
1、在编译程序之前,通过设置Project Options>>Linker>>Map file>>Detialed ,编译后会生成同程序名字相同的.map结尾的文件
2、在将程序运行时报出错误地址(如:Access violation at address 00468F0B in module 'XXX.exe'. 之中的“00468F0B”)通过16进制的减法 - 基地址(ImageBase Address) - 0x1000 后得出崩溃行的偏移地址
3、再将得出的偏移地址在.map文件中查找<=该偏移地址的地方
如:
Line numbers for XXXFrm(XXX.pas) segment .text
436 0001:005C0D98 437 0001:005C0D9B 438 0001:005C0DA1 439 0001:005C0DAC
地址前面的就是行号,大致是这样。
不知道有没有人用这种方法来查找bug的?
我最近遇到的问题是:客户不定时出现这种地址错误,但我自己无法重现,因此无法调试跟踪,如果能通过上述方法定位到异常的代码行就好办了,可惜我计算出来的偏移地址在.map文件中根本找不到(相近似的也没有)
[解决办法]
对汇编和寄存器架构不熟悉,所以我一般都是直接用第三方的工具madExcept
[解决办法]
使用FastMM来试试看!
[解决办法]
用 EurekaLog