带有生成的 C 代码的 DWARF DI?
DWARF DI with generated C code?
我似乎找不到 DWARF DI 格式的任何好的文档来回答我的问题。我正在编写一种编译为 C 的语言,有什么方法可以将 DWARF 调试信息生成到 C 代码中,还是仅用于汇编?
除了使用不如 #line
和 #file
指令?
我猜您将使用调试信息 (-g) 编译生成的 C,因此您要问的是如何获得描述您的高级语言的附加 DWARF 记录。可能的方法:
(1) 编辑目标文件以增加 C 代码的 DWARF 记录。我不知道现有的工具,也许可以使用 libdwarf or pyelftools。
(2) 想办法通过编译器 "smuggle" 额外的 DWARF 记录,例如有点像链接器命令可以通过#pragmas 给出。但是我不知道支持这个的编译器。
(3) LLVM 在 IR representation 中支持调试记录。您可以使用 clang 将生成的 C 编译为 IR (clang foo.c -S -emit-llvm -target arm -o foo.ll
),然后扩充 foo.ll,然后生成 .o (llc foo.ll
),准备链接。
第三个选项似乎是最简单的。
如果您假设您的编译器可以发出程序集,则可以完成某些事情。有关此示例,请参阅 my favorite gdb test case.
不过通常不会这样做。可能很难做到正确。如今,最好将编译器编写为 GCC 或 LLVM 的直接前端;或编写 gdb 或 lldb 帮助程序脚本以简化生成的 C 代码的调试。
我似乎找不到 DWARF DI 格式的任何好的文档来回答我的问题。我正在编写一种编译为 C 的语言,有什么方法可以将 DWARF 调试信息生成到 C 代码中,还是仅用于汇编?
除了使用不如 #line
和 #file
指令?
我猜您将使用调试信息 (-g) 编译生成的 C,因此您要问的是如何获得描述您的高级语言的附加 DWARF 记录。可能的方法:
(1) 编辑目标文件以增加 C 代码的 DWARF 记录。我不知道现有的工具,也许可以使用 libdwarf or pyelftools。
(2) 想办法通过编译器 "smuggle" 额外的 DWARF 记录,例如有点像链接器命令可以通过#pragmas 给出。但是我不知道支持这个的编译器。
(3) LLVM 在 IR representation 中支持调试记录。您可以使用 clang 将生成的 C 编译为 IR (clang foo.c -S -emit-llvm -target arm -o foo.ll
),然后扩充 foo.ll,然后生成 .o (llc foo.ll
),准备链接。
第三个选项似乎是最简单的。
如果您假设您的编译器可以发出程序集,则可以完成某些事情。有关此示例,请参阅 my favorite gdb test case.
不过通常不会这样做。可能很难做到正确。如今,最好将编译器编写为 GCC 或 LLVM 的直接前端;或编写 gdb 或 lldb 帮助程序脚本以简化生成的 C 代码的调试。