它使编译器将调试信息添加到生成的二进制文件中。该信息允许调试器将代码中的指令与源代码文件和行号相关联。如果没有调试符号,则使某些类型的调试(如单步执行代码)更加容易。
该-g选件实际上具有一些可调参数,请查阅手册。另外,如果您不优化代码,那么它是最有用的,因此请使用-O0或-Og(在较新的版本中)-优化会破坏指令与源代码之间的联系。(最重要的是你有没有从函数调用,这是一个普遍使用的优化,但基本上完全废墟走调用堆栈的能力省略帧指针。)
调试符号本身是用标准语言(我认为是DWARF2)编写的,并且有用于读取该符号的库。例如,程序甚至可以在运行时读取其自己的调试符号。
以后可以使用strip命令从二进制文件中删除调试符号(以及其他类型的符号,如函数名)。但是,由于通常将调试符号与未经优化的构建结合使用,因此没有什么意义-而是,您将构建具有不同优化的发行二进制文件,并且从一开始就没有符号。
其他编译器(例如MSVC)不在二进制文件本身中包含调试信息,而是将其存储在单独的文件和/或“符号服务器”中-因此,如果家庭用户的应用程序崩溃并且您获得了核心转储,则可以从服务器中拉出符号,并获得可读的堆栈跟踪。GCC将来可能会添加类似的功能;我已经看到了一些讨论。