我可以使用带有64位Delphi可执行文件的map2dbg吗?

时间:2012-02-23 22:50:53

标签: delphi delphi-xe2

我目前正在使用map2dbg从我的Delphi .map文件创建一个.dbg文件。这适用于32位可执行文件。对于64位可执行文件,对map2dbg.exe的调用似乎成功,但生成的.dbg文件似乎没有用处。当我在Process Explorer中查看堆栈跟踪时,它们没有符号名称。

我是否应该期望map2dbg能够在64位工作?如果没有,有没有我可以使用的替代方案?

5 个答案:

答案 0 :(得分:10)

我做了一个小小的研究,似乎map2dbg实际上可以用于Delphi XE2中制作的64位可执行文件。唯一的一点是你应该在生成的DBG文件中修改偏移4处的WORD,从$ 8664到$ 014C。

是的,这看起来像废话,因为这意味着将DBG标题中的Machine字段从AMD64更改为X86,但这确实导致在WinDbg和Process Explorer中正确加载DBG文件。

我已经制作了map2dbg版本1.3的修补版本,因此它会自动将$ 14c写入DBG。这是档案:http://yadi.sk/d/kbVFCGyI2gQzM

更新: Process Explorer和WinDbg都接受使用修补版本的map2dbg创建的DBG文件,这些DBG中的符号与可执行文件中的相应地址正确链接,但显示错误的堆栈帧。

原因在于DBGHELP库。从它的反汇编中可以看出,它只加载为X86或Alpha处理器制作的DBG文件(机器字段值$ 14c和$ 184)。但是如果我们手动将DBG文件中的Machine字段从AMD64更改为X86,那么DBGHELP会将可执行文件视为32位模块(因此在堆栈展开期间不会使用可执行文件中的PDATA段),并且堆栈不正确调试器将显示帧。

我修补了安装WinSDK for Win8的x86和x64版DBGHELP。修补版本允许使用AMD64机器字段($ 8664)加载DBG文件,因此堆栈帧显示为预期。这个档案中提供了这些版本:http://yadi.sk/d/7ZDLv2ed2gRGo

因此,我们现在有两种不同的方法来使用使用Delphi XE2编译的64位可执行文件中的符号:

  1. 简单方法:使用修补后的map2dbg生成“fake-x86”DBG,可以加载到WinDbg和Process Explorer中,这样就会显示符号地址,但调试器将无法显示堆栈帧。

  2. “Hardcore”方式:使用已修补的dbghelp.dll,并支持AMD64 DBG文件。使用此版本的DBGHELP,WinDbg和Process Explorer可以展开堆栈帧。

  3. 更多更新: cv2pdb工具现在可以将使用map2dbg创建的DBG文件转换为PDB。支持32位和64位可执行文件。

    Here's cv2pdb的最新来源的编译版本。

答案 1 :(得分:3)

不幸的是,在较新版本的Microsoft产品(windbg,process explorer,visual studio等)中不推荐使用* .dbg支持(注意:甚至不使用或加载!)。 因此,即使它创建了一个有效的.dbg文件,它也永远不会被使用......: - (

我最大的愿望是能够创建.pdb文件!所以,如果有人能得到它的规格?! (这是一个封闭的MS格式?) 因为,更糟糕的是,最新的英特尔VTune /线程分析器也不再使用.dbg文件了,所以我真的想要一个DELPHI到PDB转换器! (对不起喊叫)

我尝试了几件事,但还没有成功。 这就是我创建自己的堆栈查看器和minidump查看器的原因,它使用Delphi调试符号(.map,.jdbg等): http://code.google.com/p/asmprofiler/wiki/ProcessStackViewer http://andremussche.blogspot.com/2011/03/minidump-reader-for-delphi.html

注意:我还没有在64位Delphi应用程序上测试我的东西......所以它可能无法正常工作,但无论如何都可以尝试...

答案 2 :(得分:1)

仅供参考:我找到了一位PDB作家 https://github.com/jbevain/cecil/blob/master/symbols/pdb/Mono.Cecil.Pdb/PdbWriter.cs

它是Mono Cecil库的一部分(开源.net实现)。 我希望它也可以修改为读取Delphi .map文件... (尚未测试)

答案 3 :(得分:0)

仅为了您的信息,我为dbghelp.dll制作了一个概念验证DLL,所以 它还可以读取Delphi .map文件。 它是某种代理DLL:它具有相同的真实dll导出,但是 它们全部转发到真实/原始dll。 3个符号功能 用Delphi(jclDebug.pas)查找实现: https://plus.google.com/u/0/110131086673878874356/posts/4rmyQM5kVW7 https://plus.google.com/u/0/110131086673878874356/posts/TSJRqFJR3WZ

现在只有32位。 ProcesExplorer仅在64位Windows中以64位运行,但是 ProcesHacker也有32位版本。当我有更多的时间,我可以 进一步改进......或者在同一时间自己尝试!在64位模式下你 不能使用“ASM JMP PToProc”,而是像“ASM JMP qword ptr [rel p]”。

答案 4 :(得分:0)

我对tds2pdb进行了一些修改(实际上是对例外:-))。 现在它也适用于32位和64位的Delphi .tds文件! 看我的G +帖子: https://plus.google.com/u/0/110131086673878874356/posts/eJBKC16e5f6

注意:只有ProcesExlorer没有显示我的64位测试程序的完整堆栈,但是ProcesHacker和WinDbg显示了完整的堆栈。