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


有没有人经历混合-g(调试符号)和-O2(最佳安全优化)与gcc编译器?
我必须调试分发给最终用户的发布程序的崩溃,这些程序可以将我发回核心文件。
我一直习惯称:

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

并看看问题出在哪里。现在我可以看到调用跟踪但没有调试符号我遇到了麻烦。

任何想法?


7043
2018-01-14 15:21


起源



答案:


我们在生产环境中一起使用它们,如果客户只看到一次崩溃,这使调试变得更容易。它可以让你很好地了解问题所在(不是内存损坏)。

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


6
2017-12-28 01:45



只有调试器才需要带符号的图像。如果您正在使用远程调试器或从核心文件进行事后调试,则目标上运行的图像可能会从中删除符号。 - Michael Burr
小点:如果使用ccache加速构建,-g(默认情况下)强制ccache不占用源文件的路径,因此不同目录中的构建不会从缓存中受益。 - Jack Wasey


答案:


我们在生产环境中一起使用它们,如果客户只看到一次崩溃,这使调试变得更容易。它可以让你很好地了解问题所在(不是内存损坏)。

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


6
2017-12-28 01:45



只有调试器才需要带符号的图像。如果您正在使用远程调试器或从核心文件进行事后调试,则目标上运行的图像可能会从中删除符号。 - Michael Burr
小点:如果使用ccache加速构建,-g(默认情况下)强制ccache不占用源文件的路径,因此不同目录中的构建不会从缓存中受益。 - Jack Wasey


它工作正常。

或者,由于优化,有时您使用调试器的源代码与源完全不匹配,但IMHO尽管具有调试符号使调试更容易。


10
2018-01-14 15:28



此外,有时源代码行是按顺序执行的,这让我一开始很困惑。 - mkb
我习惯了这个行为调试VC Release代码。即使我声明-g,如果代码优化完全相同,我只是在徘徊... - Mr.Gate
-g 对代码没有任何影响,只对生成的其他调试数据有影响。 - R..