当EXE引发异常消息如“地址XXXXXXXX上的访问冲突...”时,地址XXXXXXXX是十六进制值,我们可以通过查看映射文件获取导致异常的源代码行号。以下详细信息(by madshi at EE):
你需要减去图像库, 这大概是40万美元。 此外,你需要减去 “代码基础”地址,即 存储在每个图像的nt标题中 模块(exe / dll)。通常是1000美元。 您可以检查它具有的值 使用免费软件工具“PEProwse Pro“。这是”基地代码“中的字段 “可选的”细节 标题“。你也会找到图像 那里的基地址。
我的问题是:如何获取 DLL 的源代码行?相同的计算是否适用?谢谢!
注1:地图文件由Delphi生成,我不确定这是否重要。
注意2:我一直在使用JCL DEBUG,但它无法捕获DLL启动时出现的异常(实际上是Office加载项)。
答案 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。