在没有 -g 选项的情况下编译,但我想获得更详细的调试信息

Compile without -g option but I want to get more detailed debug info

本文关键字:信息 调试 选项 情况下 编译      更新时间:2023-10-16

对于我的项目,发布版本(使用-O2标志编译)比调试版本(使用-g -O0标志编译)具有更高的性能。

所以我必须使用发布版本。

但是,在生产环境中,发布程序有时会生成核心转储。

然后,我使用gdb xxx core调试核心转储文件,但没有足够的信息供我使用。

我不在乎程序或任何其他文件的大小。我想要最好的性能和最详细的调试信息。

我该怎么办?

-g

不会更改生成的代码。它仅添加调试信息。因此,它不应影响性能。

您应该调查为什么会看到性能差异 - 这可能会揭示一些有用的信息。

优化设置是影响效果的设置。如果您需要启用它们,请尝试-Og优化设置。它将实现不干扰调试的优化。

最后,生产通常不是一个调试的好地方。您的其他环境应设计为重现生产环境中可能发生的所有 bug。目标是确保您永远不会在生产环境中遇到新的错误。当然,在实践中非常困难,但请考虑花更少的时间让调试在生产环境中工作,而花更多的时间让你的其他环境如此紧密地匹配,以便你可以识别(也许通过比较日志)然后在那里重现错误。作为一项好处,您将在更多错误进入生产环境之前捕获它们。

你应该使用-g -O2进行编译,并且(如果你确定有必要的话),将调试符号剥离到一个单独的符号文件中。 我不记得确切的步骤,因为我通常在构建包时dh-strip让我这样做,但这个想法是符号在程序过程中不会消耗内存 - 将它们加载到调试器中。

我想要最好的性能

我该怎么办?

启用优化。

我想。。。最详细的调试信息。

我该怎么办?

禁用优化(或者如果您的编译器支持此类选项:仅启用不影响调试的优化;-Og在 g++ 的情况下)并启用调试符号。

您可能会注意到,这些要求是冲突的。

从发布中调试转储的一个体面的折衷方案是启用优化,并为构建启用调试信息,特别是考虑到......

我不在乎程序或任何其他文件的大小。

这是调试信息主要影响的内容。除非您关心程序的大小,否则无需避免启用调试信息。

您还希望设置-fno-omit-frame-pointer,以便在调试时知道自己的位置。它会减慢执行速度,因为可用的寄存器较少,但调试是性能和信息之间的折衷(有时您需要这些来发现编译器在发布模式下假设了事情!

CMake 默认使用-O3发布,-O2 -g发布,其中包含调试信息(对于调试和分析很有用),因此您有一个良好的开端,只需添加帧指针即可获得更好的上下文。

是的,在生产中调试?可怕。查找复制者。