在gcc中使用-g和-O2选项

14

有没有人在使用gcc编译器时尝试混合-g(调试符号)和-O2(最佳安全优化)?
我必须调试一个分发给最终用户的发布程序崩溃的问题,他们可能会把core文件发送给我。
我一直都习惯于这样调用:

gdb << myprogram >> << core file >>

并查看问题所在。现在我只能看到函数调用跟踪,但由于没有调试符号,我遇到了很多麻烦。

有任何想法吗?


“-O3” 不应该被认为是“不安全”的。有时编译器的错误存在于只有在使用“-O3”时才运行的编译器内部的某些部分,但有时它们存在于使用“-O2”的部分中。你可以说,“-O2”是最好的“保守”优化,像最小化或不进行自动向量化,并且不像更大的代码大小那样具有侵略性。(基于配置文件的优化可以帮助GCC知道哪些循环是热点,哪些循环是冷门的,因此应更多地针对大小进行优化。) - Peter Cordes
2个回答

13

它运行良好。

但是,由于优化的原因,有时候通过调试器跟踪的源代码与实际源代码不完全匹配,但是我认为,即使出现这种情况,拥有调试符号仍然能够使调试更加容易。


4
有时源代码行会无序执行,这让我一开始感到困惑。 - Matt K
我已经习惯了在调试VC Release代码时出现这种行为。 我只是在想,即使我声明了-g,代码是否仍然被优化了... - Mr.Gate
5
-g对代码本身没有任何影响,只会生成额外的调试数据。 - R.. GitHub STOP HELPING ICE

8

我们在生产环境中同时使用两者,如果客户只看到了一次崩溃,这使得调试变得容易得多。它可以让您对问题的位置有一个相当好的想法(而不是内存损坏)。

理论上,添加-g不应该真正影响性能,尽管可执行文件会变大。在嵌入式环境中,这是一个很大的折衷。


6
只有调试器需要带符号的图像。如果你在使用远程调试器或从核心文件进行死后调试,目标上运行的图像可以去除其中的符号。 - Michael Burr
小提示:如果您使用ccache来加速构建,-g(默认情况下)会强制ccache注意源文件的路径,因此在不同目录中进行的构建无法从缓存中受益。 - Jack Wasey
最近的ccache在文档中提供了一些提示来改善情况,https://ccache.dev/manual/latest.html#_compiling_in_different_directories - user7610

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接