GCC -g vs -g3 GDB 标志:有啥区别?
Posted
技术标签:
【中文标题】GCC -g vs -g3 GDB 标志:有啥区别?【英文标题】:GCC -g vs -g3 GDB Flag: What is the Difference?GCC -g vs -g3 GDB 标志:有什么区别? 【发布时间】:2012-05-15 13:05:12 【问题描述】:当使用 gcc 或 Clang 编译 C 源代码时,我总是使用 -g
标志来生成 gdb 的调试信息。
gcc -g -o helloworld helloworld.c
我注意到有些人推荐-g3
。 -g
和 -g3
标志之间有什么区别? -g
和-ggdb
还有区别吗?
【问题讨论】:
我来到这里是因为我正在使用别人的 makefile,而且文档是一头野兽。 *** 上的好问题,可以从谷歌找到一个简单的答案。 只要您愿意深入挖掘,关于 SO 的绝大多数问题都“涵盖了我的文档”。这不是驳回问题的正当理由。 【参考方案1】:tl;dr: 要回答您的具体问题,-g3
“包括额外的信息,例如宏定义......当您使用 -g3
时,一些调试器支持宏扩展”,而 @987654324 @ 不包含此额外信息。
更广泛的答案是 gcc 支持四个级别的调试信息,从-g0
(禁用调试信息)到-g3
(最大调试信息)。
指定-g
等效于-g2
。奇怪的是,gcc docs 很少提及-g
/-g2
包含或排除的信息:
请求调试信息并且还使用级别来指定多少信息。默认级别为 2。 级别 0 根本不产生任何调试信息。因此,-g0 否定 -g。
级别 1 生成的信息最少,足以在您不打算调试的程序部分中进行回溯。这包括函数和外部变量的描述,以及行号表,但没有关于局部变量的信息。
级别 3 包括额外信息,例如程序中存在的所有宏定义。当你使用 -g3 时,一些调试器支持宏扩展。
【讨论】:
【参考方案2】:来自docs:
-g
以操作系统的本机格式(stabs、COFF、XCOFF 或 DWARF 2)生成调试信息。 GDB 可以使用它 调试信息。在大多数使用 stabs 格式的系统上,-g 允许使用只有 GDB 可以使用的额外调试信息;这 额外的信息使调试在 GDB 中工作得更好,但可能 使其他调试器崩溃或拒绝读取程序。如果你想 要确定是否生成额外信息,请使用 -gstabs+、-gstabs、-gxcoff+、-gxcoff 或 -gvms(见下文)。
...
-ggdb
生成供 GDB 使用的调试信息。这意味着使用最具表现力的可用格式(DWARF 2、stabs 或本机 格式,如果这些都不支持),包括 GDB 扩展,如果 完全有可能。
-gvms级别
请求调试信息,也使用 level 来指定多少信息。默认级别为 2。级别 0 不生成 调试信息。因此,-g0 否定 -g。
....
第 3 级包括额外信息,例如所有宏定义 出现在节目中。一些调试器支持宏扩展 你使用 -g3。
【讨论】:
仍然可以解释例如“最具表现力的格式”和“额外信息”之间的区别是什么?这些参数是免费的吗?他们中的许多人提到了 GDB...谢谢!以上是关于GCC -g vs -g3 GDB 标志:有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章