Kos*_*Kos 9 c c++ logging gdb debug-symbols
我有一些关于调试符号的问题以及可以用它们做什么,以及调试.我最感兴趣的是有关GCC的答案,但我也很高兴知道它在其他编译器(包括MSVC)下的样子.
首先:
还有一些更实际的问题...... 我怎么能:
我要强调一点,我说的是运行时检查.所有这些都可以通过GDB读取和漂亮打印,但我不知道调试符号本身有多少信息以及GDB也可以访问的源代码中有多少信息.
也许有一个库能够解析调试符号并产生这样的信息?
调试符号的标准化是否足够好以至于我可以期待这种解决方案的某种程度的可移植性?
调试符号的常见格式/类型有哪些?
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 - 它的用法很好地记录在案网上有很多例子.还有可用于查询PDB文件的DIA SDK.
调试符号的标准化是否足够好以至于我可以期待这种解决方案的某种程度的可移植性?
DWARF有一个正式的规范,它很复杂.PDB AFAIK没有记录,但是dbghelp/DIA是推荐的方式.