不带-g选项进行编译,但我想获得更详细的调试信息

问题描述 投票:0回答:5

对于我的项目,发布版本(使用

-O2
标志编译)比调试版本(使用
-g -O0
标志编译)具有更高的性能。

所以我必须使用release版本。

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

然后我使用

gdb xxx core
调试核心转储文件,但没有足够的信息。

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

我该怎么办?

c++ c++11 gdb g++ coredump
5个回答
5
投票

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

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

优化设置是影响性能的设置。如果您需要打开它们,请尝试

-Og
优化设置。它将实现不干扰调试的优化。

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


2
投票

您应该使用

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


0
投票

我想要最好的表现

我该怎么办?

启用优化。

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

我该怎么办?

禁用优化(或者如果您的编译器支持此类选项:仅启用不干扰调试的优化;

-Og
,如果是 g++)并启用调试符号。

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

从版本中调试转储的一个不错的折衷方案是启用优化,并启用构建的调试信息,特别是考虑到......

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

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


0
投票

为了获得最佳调试信息,请使用这些标志

-O0 -g -rdynamic

这是在 Linux 和 gcc 中


-1
投票

您还需要设置

-fno-omit-frame-pointer
,以便您在调试时知道自己在哪里。它会减慢执行速度,因为有一个可用的寄存器较少,但调试是性能和信息之间的折衷(有时您需要这些来找出编译器在发布模式下假设的东西!)。

CMake 默认使用

-O3
进行发布,使用
-O2 -g
进行带有调试信息的发布(对于调试和分析很有用),因此您有一个良好的开始,只需添加帧指针即可获得更好的上下文。

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

© www.soinside.com 2019 - 2024. All rights reserved.