Debugging 关于如何编写调试格式转换工具的建议

Debugging 关于如何编写调试格式转换工具的建议,debugging,dwarf,Debugging,Dwarf,我想写一个工具,目的是将一种格式的调试符号转换成另一种格式,以便在GDB下使用。这似乎是一个乏味且可能复杂的项目,所以我不确定如何处理它 最初,我的目标是将borland编译器发出的Turbo调试符号表(TDS)转换为STAB或dwarf格式(我的研究似乎更喜欢dwarf)。但理想情况下,我希望我的工具设计得足够容易扩展,以便以后也能转换其他格式。e、 g.代码视图4或甚至pdb 我创建此项目的主要动机是: 互操作性。如果我可以将外部调试格式转换为gdb可以使用的格式,那么可以对从gcc以外的

我想写一个工具,目的是将一种格式的调试符号转换成另一种格式,以便在GDB下使用。这似乎是一个乏味且可能复杂的项目,所以我不确定如何处理它

最初,我的目标是将borland编译器发出的Turbo调试符号表(TDS)转换为STAB或dwarf格式(我的研究似乎更喜欢dwarf)。但理想情况下,我希望我的工具设计得足够容易扩展,以便以后也能转换其他格式。e、 g.代码视图4或甚至pdb

我创建此项目的主要动机是:

  • 互操作性。如果我可以将外部调试格式转换为gdb可以使用的格式,那么可以对从gcc以外的其他编译器编译的二进制文件进行源代码级调试。这意味着任何使用gdb作为后端的前端调试接口都可以正常工作
  • 没有其他工具。我在谷歌上搜索过类似的工具,我找到的最接近的工具是。但它不完全符合我的要求
目前我必须处理的事项:

  • 我已经有了一个可以理解TDS调试格式的程序。我可以用它来帮助我从转换的源格式中获取所需的信息
  • 对于这个项目的范围,我主要感兴趣的是让它在win32环境下工作。我并不真正关心的其他平台和工具
  • 我要转换为的目标dwarf调试格式。这个我真的一点都不熟悉。我以前使用过像MinGW这样的gcc移植编译器,并使用dwarf格式的gdb对它们进行了调试。但我不知道这种格式是如何在windows上实现的
最后一点是我关心的。我正在阅读dwarf规范文档,但我发现我很难真正理解和理解它是如何工作的。这里有太多的细节,但同时也没有任何关于dwarf是如何在一个不使用ELF的平台(即windows使用的PE-COFF格式)上的对象文件和图像文件上实现的细节。该文档也是一个非常枯燥的阅读,长句使其难以理解,图表和插图稀少。我遇到了一个名为的API,它应该可以将大部分解析工作从解释dwarf中移除。问题是,我仍在尝试构建它,但我不知道它将如何运行

我还没有写任何代码,因为我不完全理解我需要构建什么。我有一种感觉,由于侏儒的复杂性,最大的困难将是如何解决它。谷歌搜索有关dwarf如何在windows下工作的信息,也没有发现任何有用的信息。例如,在PE可执行映像文件中包含dwarf所需的“胶水”代码没有相关信息。矮人的部分到底是如何布置的?每个部分都有标题信息吗?显然,GDB并不仅仅是获取一个“原始”矮人调试文件并按原样使用它。那么gdb希望调试文件采用何种格式才能使用它呢


我的问题是,我如何开始这样一个项目?更重要的是,当我不可避免地遇到问题时,我可以向哪里寻求帮助?

您在这里提出了几个问题:-)

  • 我认为你正朝着正确的方向前进,使用libdwarf。 但是,您是否查看过objcopy,看看这个工具是否可以为您完成一些工作?它可能不支持borland、pdb或codeview4,但可能值得研究。(另一种方法可能是扩展objcopy以支持您试图在两者之间转换的格式。)

  • 有时当我陷入困境时,我会使用侏儒讨论邮件列表。

  • 至于关于侏儒的问题,把它们分成几个单独的问题,我会尽我最大的努力解决 回答他们。:-)


  • Windows仿射汇编程序

    Affinic Assembler是一个用于Windows的x86/x86-64汇编程序,它使用GAS语法汇编源代码和DWARF调试信息,并在目标文件中生成相应的CodeView格式部分,以便使链接程序在Visual Studio中可调试。该程序适合Cygwin和MinGW用户将Linux代码移植到Windows


    谢谢你的回答。我以为这个问题会被埋没在这里,然后消失在这里:Phaven以前没听说过那个汇编程序,但我一定会去看看。Thanks@VictorT. 你有机会试用这个调试器吗?怎么样?你开始做这件事了吗?我有时也发现需要像你描述的那样的工具。不太不幸的是,dwarf格式缺乏可理解的规范对我来说是一个很大的障碍。幸运的是,有人分叉了gdb并添加了基本的tds支持,所以我真的不需要:。尽管如此,您可能会发现它很有用,但它似乎只支持读取和解析,而不支持符号生成。