-2

我看到很多关于 gdb 的教程要求在编译 c 程序时使用 -g 选项。我不明白 -g 选项实际上做了什么。

4

1 回答 1

5

它使编译器将调试信息添加到生成的二进制文件中。此信息允许调试器将代码中的指令与源代码文件和行号相关联。如果根本不可能的话,拥有调试符号会使某些类型的调试(如单步调试代码)更加容易。

-g选项实际上有一些可调参数,请查看手册。此外,如果您不优化代码,它最有用,因此使用-O0or -Og(在较新版本中) - 优化会破坏指令和源代码之间的联系。(最重要的是,您不能在函数调用中省略帧指针,这是一种流行的优化,但基本上完全破坏了向上调用调用堆栈的能力。)

调试符号本身是用标准化语言编写的(我认为它是 DWARF2),并且有一些库可以读取它。例如,程序甚至可以在运行时读取自己的调试符号。

strip稍后可以使用该命令从二进制文件中删除调试符号(以及其他类型的符号,如函数名称) 。但是,由于您通常会将调试符号与未优化的构建组合在一起,因此没有多大意义 - 相反,您将构建具有不同优化从一开始就没有符号的发布二进制文件。

其他编译器(例如 MSVC)不会在二进制文件本身中包含调试信息,而是将其存储在单独的文件和/或“符号服务器”中——因此,如果家庭用户的应用程序崩溃并且您获得核心转储,您可以从您的服务器中提取符号并获得可读的堆栈跟踪。GCC 将来可能会添加类似的功能;我看过一些关于它的讨论。

于 2013-09-14T10:46:43.320 回答