从应用程序在运行时读取调试信息

时间:2011-02-18 19:01:33

标签: c++ c logging gdb debug-symbols

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

首先:

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

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

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

让我强调一下,我在谈论运行时检查。所有这些都可以通过GDB读取和漂亮打印,但我不知道调试符号本身有多少信息以及GDB也可以访问的源代码中有多少信息。

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

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

1 个答案:

答案 0 :(得分:8)

  

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

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

  

它们如何与编译器和平台相关? GCC和MinGW在平台上的格式是否一样?

GCC在Linux(ELF)和Windows(PE)上使用DWARF / STABS(我认为它是GCC编译时选项),不了解其他人。 MSVC始终使用PDB。

  

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

您可以解析可执行映像,看看是否有包含调试信息的部分(请参阅STABS documentationDWARF specs)。 PDB文件使用可执行文件或通过符号服务器分发(因此,如果您不想联机,请检查X.exe / X.dll是否有X.pdb)。

关于如何阅读和使用这些符号 - 我不知道DWARF / STABS(可能存在可以找到并提取这些符号的GNU binutils),但对于PDB,最好的办法是使用dbghelp - 它的用法是pretty well documented,网上有很多例子。还有DIA SDK可用于查询PDB文件。

  

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

DWARF有一个正式的规范,它很复杂。 PDB AFAIK没有记录,但dbghelp / DIA是推荐的方式。