gcc 中 -g 选项的作用是什么

2024-05-13

我看到很多关于 gdb 的教程要求在编译 c 程序时使用 -g 选项。我无法理解 -g 选项的实际作用。


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

The -g选项实际上有一些可调参数,请查看手册。另外,如果你不优化代码,它是最有用的,所以使用-O0 or -Og(在较新的版本中) - 优化打破了指令和源代码之间的连接。 (最重要的是你必须not从函数调用中省略帧指针,这是一种流行的优化,但基本上完全破坏了遍历调用堆栈的能力。)

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gcc 中 -g 选项的作用是什么 的相关文章

随机推荐