从映射文件中获取DLL的源行号

时间:2011-02-17 18:27:06

标签: delphi debugging exception-handling stack

当EXE引发异常消息如“地址XXXXXXXX上的访问冲突...”时,地址XXXXXXXX是十六进制值,我们可以通过查看映射文件获取导致异常的源代码行号。以下详细信息(by madshi at EE):

  

你需要减去图像库,   这大概是40万美元。   此外,你需要减去   “代码基础”地址,即   存储在每个图像的nt标题中   模块(exe / dll)。通常是1000美元。   您可以检查它具有的值   使用免费软件工具“PEProwse   Pro“。这是”基地代码“中的字段   “可选的”细节   标题“。你也会找到图像   那里的基地址。

我的问题是:如何获取 DLL 的源代码行?相同的计算是否适用?谢谢!

注1:地图文件由Delphi生成,我不确定这是否重要。

注意2:我一直在使用JCL DEBUG,但它无法捕获DLL启动时出现的异常(实际上是Office加载项)。

2 个答案:

答案 0 :(得分:2)

相同的计算适用,请注意以下内容:您需要获取已加载DLL的实际地址,而不是EXE的图像基址。 DLL的代码基础应采用与EXE相同的方式(存储在PE的IMAGE_OPTIONAL_HEADER中)。

顺便说一句,从PE格式的角度来看,EXE和DLL实际上是一回事。

答案 1 :(得分:1)

无法在同一地址加载两个二进制文件。因此,存储在DLL / EXE中的图像基地址仅是二进制优化的建议。二进制文件实际加载到内存中的位置取决于许多因素,例如首先在进程中加载​​的其他二进制文件,Windows版本,注入的第三方dll等等。

根据建议,您可以使用调试器或Process Explorer之类的工具来查找当时加载DLL的地址。或者如果你想从代码中知道你可以从DLL since both are the same获取HInstance或HModule,并且是内存中加载DLL的地址。 Delphi通过GetModuleHandle方法为您获取其他DLL的HModule。较新的Delphi版本还有其他方法可以找到HInstance。