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

Dav*_*nan 4 delphi delphi-xe2

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

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

Ale*_*ter 11

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

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

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

更新:使用修补版本的map2dbg创建的DBG文件由Process Explorer和WinDbg接受,并且来自这些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. "硬核"方式:使用补丁的dbghelp.dll,支持AMD64 DBG文件.使用此版本的DBGHELP,WinDbg和Process Explorer可以展开堆栈帧.

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

是cv2pdb最新源代码的编译版本.