2015-02-10 115 views
1

当涉及到在发生异常的应用程序中查找偏移量时,我有两个相关的问题。查找异常地址

,第一是关于我用它来寻找计算的偏移量是:

Offset = ExceptionAddress - $00400000 - $1000

我知道$00400000是在连接设置中的形象基础,但其中确实来自$1000?它总是$1000

第二个问题是关于使用上述计算时产生的偏移量,地址为001BD81F的例外地址。计算结果保留了FFFFFFFFFFDBC81F的偏移量。这似乎是一个负面的价值,我不确定什么可能会导致这种情况,其他垃圾例外地址首先被返回。

+1

安装Eurekalog并让它为您完成工作 – 2015-02-10 08:04:52

回答

3

Delphi映射文件报告相对于包含它的段的起始符号的地址。地图文件的开头是这样的:

 
Start   Length  Name     Class 
0001:00401000 00AD87A4H .text     CODE 

也就是说,代码段起始地址为00401000。我相信0040000000401000之间是PE元数据。

地图文件看起来像这样的后续部分:

 
Detailed map of segments 

0001:00000000 0000E174 C=CODE  S=.text G=(none) M=System ACBP=A9 
0001:0000E174 00000734 C=CODE  S=.text G=(none) M=SysInit ACBP=A9 
.... 

通知的地址是怎么写的。因此,0001:0000E174意味着从该段开始的段0001,偏移0000E174。一旦模块被加载,绝对地址就是通过获取段基地址,并将该偏移量加到符号上而形成的。所以SysInit模块从00401000 + 0000E174 = 0040F174开始。

根据我的经验,链接器总是将代码段放置在与模块基址相同的偏移处。但是你不需要假设。您可以从地图文件中读取信息。

地址001BD81F位于不同的模块中。也就是说,该地址,如果它确实是代码,则是来自您的可执行文件加载的DLL的代码。所以,你将无法在你的可执行文件的映射文件中找到它的符号。您需要首先确定地址在哪个模块中,然后找到该模块的符号映射。

使用像madExcept,EurekaLog或JclDebug这样的工具来提供这样的信息是非常容易的。您将通过这种方式获得更丰富的信息。