9

除了调试之外,我还有一些关于调试符号以及可以用它们做什么的问题。我最感兴趣的是关于 GCC 的答案,但我也很高兴知道它在其他编译器下的样子,包括 MSVC。

首先:

  • 调试符号的常见格式/类型是什么?
  • 它们与编译器和平台有什么关系?平台之间的 GCC 和 MinGW 上的格式是否总是相同的?
  • 我可以在运行时检查构建是否有它们以及它们的格式是什么?

还有一些更实际的问题......我怎么能

  • 检查当前文件和行号?
  • 获取正在执行的(合格的)函数名?
  • 获取完整的当前堆栈跟踪?

让我强调一下,我说的是运行时检查。所有这些都可以被 GDB 读取和打印出来,但我不知道有多少信息来自调试符号本身,还有多少来自 GDB 也可以访问的源代码。

也许有一个库能够解析调试符号并产生这样的信息?

调试符号是否标准化得足够好,以至于我可以期望此类解决方案具有一定程度的可移植性?

4

1 回答 1

8

调试符号的常见格式/类型是什么?

DWARF 和 STABS(嵌入可执行文件的特殊部分)、程序数据库(PDB;外部文件,由 MSVC 使用)。

它们与编译器和平台有什么关系?平台之间的 GCC 和 MinGW 上的格式是否总是相同的?

GCC 在 Linux (ELF) 和 Windows (PE) 上都使用 DWARF/STABS(我认为这是一个 GCC 编译时选项),不知道其他人。MSVC 始终使用 PDB。

我可以在运行时检查构建是否有它们以及它们的格式是什么?

您可以解析可执行映像并查看是否有带有调试信息的部分(请参阅STABS 文档DWARF 规范)。PDB 文件通过可执行文件或符号服务器分发(因此,如果您不想上网,请检查是否有用于 X.exe/X.dll 的 X.pdb)。

关于如何阅读和使用这些符号——我不知道 DWARF/STABS(GNU binutils 周围可能有一些可以定位和提取这些符号的东西),但对于 PDB,你最好的选择是使用dbghelp——它的用法有很好的文档网上有很多例子。还有DIA SDK可用于查询 PDB 文件。

调试符号是否标准化得足够好,以至于我可以期望此类解决方案具有一定程度的可移植性?

DWARF 有一个正式的规范,而且非常复杂。PDB AFAIK 没有记录,但 dbghelp/DIA 是并且是推荐的方式。

于 2011-02-18T19:20:24.390 回答