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

标签 delphi debugging exception stack

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

you need to substract the image base, which is most probably $400000. Furthermore you need to substract the "base of code" address, which is stored in the image nt headers of each module (exe/dll). It's usually $1000. You can check which value it has by using the freeware tool "PEProwse Pro". It's the field "Base Of Code" in the "Details" of the "Optional Header". You'll also find the image base address there.

我的问题是:如何获取DLL的源行号?同样的计算也适用吗?谢谢!

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

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

最佳答案

应用相同的计算,但需要注意以下事项:您需要使用加载 DLL 的实际地址,而不是 EXE 的图像基地址。 DLL 的代码库应采用与 EXE 相同的方式(存储在 PE 的 IMAGE_OPTIONAL_HEADER 中)。

顺便说一句,从PE格式的角度来看,EXE和DLL实际上是同一个东西。

关于delphi - 从 DLL 的映射文件中获取源行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032968/

相关文章:

delphi - 寻找日程安排/日历组件

c# - 调用具有两个相同参数的方法返回两个不同的结果

android - 如何在android的webview中调试javascript

java - 为什么添加 try block 会使程序更快?

java - Java 方法在抛出异常时返回给 JNI 调用者的是什么?

delphi - 想要将标记图标更改为小圆圈

class - 使用 RTTI 混淆继承

windows - 以编程方式跟踪目录中的更改

java - 图像 slider 错误 Android 应用程序

c# - 不要在堆栈跟踪中显示构建机器的文件路径