【问题标题】:Can I use map2dbg with 64 bit Delphi executables?我可以将 map2dbg 与 64 位 Delphi 可执行文件一起使用吗?
【发布时间】:2018-04-01 12:05:00
【问题描述】:

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

我什至应该期望 map2dbg 在 64 位中工作吗?如果没有,我可以使用其他替代方法吗?

【问题讨论】:

  • 听起来对这个人有用:capnbry.net/blog/?p=18
  • @500-InternalServerError 该帖子发布于 2010 年。该帖子中的 64 位必须只是在 WOW64 模拟器下运行 32 位 Delphi 进程的 64 位操作系统。
  • 我猜你是对的 - 很抱歉让你寄予厚望。
  • 我不这么认为。据我所知,map2dbg 已更新为使用由 Delphi 版本创建的地图文件,直到 2009 年。XE 和 XE2 没有被提及。对源代码的最后一次提交似乎是在 2009 年完成的。问题仍然是 32/64 位图文件之间是否存在显着差异。这不会让我感到惊讶,但目前还找不到任何东西。
  • @marjan map2dbg 可以在 32 位 xe2 上正常工作

标签: delphi delphi-xe2


【解决方案1】:

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

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

我制作了 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 段),并且堆栈不正确框架将由调试器显示。

我已经为 Win8 的 WinSDK 安装了 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 位可执行文件。

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

【讨论】:

  • 哦,我马上去试试!听起来很有希望!
  • 好的,我试了一下。它确实会生成由 Process Explorer 成功加载的 .dbg 文件。但是,Process Explorer 发出的堆栈跟踪不正确。它们有我的可执行文件中的符号,但它们显然不是正确的符号。我看到堆栈跟踪说函数 1 被函数 2 调用,我知道函数 2 没有调用函数 1。我想知道还需要什么。
  • 我在 WinDbg 中测试了几个 DBG,并且正确地为符号分配了它们的地址。我认为我们看不到正确堆栈信息的原因是 Delphi 使用了一些不标准的堆栈帧(与 MS VC 相比)。我将尝试使用不同的调用约定,也许如果 Delphi funcs/procs 被声明为 cdecl 或 stdcall,它们将按预期显示。
  • 不幸的是,非默认调用约定不会改善堆栈帧信息。似乎如果一个 DBG 文件被标记为 X86,DBGHELP 在展开堆栈时拒绝使用 PDATA 段中的函数信息 :( 我要弄清楚为什么 DBGHELP 不加载原始 DBG(使用 AMD64 机器字)。
  • 我已经从codeproject.com/Articles/11132/Walking-the-callstack 文章中修改了项目,所以它从我用 Delphi 编译的 DLL 中调用了一个函数。然后我在 MSVC 中调试了项目,以找出它决定不加载我的 DBG 文件的 dbghelp 库中的位置。有两个这样的地方 - 在 cbFindDbg 和 ReadHeader 函数中。
【解决方案2】:

不幸的是,在较新版本的 Microsoft 产品(windbg、进程资源管理器、Visual Studio 等)中,*.dbg 支持已被弃用(注意:甚至没有使用或加载!)。 所以即使它创建了一个有效的 .dbg 文件,它也永远不会被使用...... :-(

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

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

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

【讨论】:

  • 进程浏览器支持.dbg文件
【解决方案3】:

仅供参考:我找到了一个 PDB 编写器 https://github.com/jbevain/cecil/blob/master/symbols/pdb/Mono.Cecil.Pdb/PdbWriter.cs

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

【讨论】:

  • 听起来很有希望。有人想知道 .net 的 PDB 文件是否与本机代码的相同。
【解决方案4】:

仅供参考,我为 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]”。

【讨论】:

    【解决方案5】:

    我对 tds2pdb 做了一些修改(实际上是注释了异常:-))。 现在它也适用于 32 位和 64 位的 Delphi .tds 文件! 请参阅我的 G+ 帖子: https://plus.google.com/u/0/110131086673878874356/posts/eJBKC16e5f6

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

    【讨论】:

    • 我尝试过这个,但看起来它需要更多的润色。 pdb 创建引发了大量错误。并且不能从 64 位可执行文件中剥离 TDS 信息是一个杀手锏。
    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2011-04-02
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多