对于我的项目,发布版本(使用
-O2
标志编译)比调试版本(使用 -g -O0
标志编译)具有更高的性能。
所以我必须使用release版本。
但是,在生产环境中,发布程序有时会产生核心转储。
然后我使用
gdb xxx core
调试核心转储文件,但没有足够的信息。
我不关心程序或任何其他文件的大小。我想要最好的性能和最详细的调试信息。
我该怎么办?
您应该使用
-g -O2
进行编译,并且(如果您确定有必要),将调试符号剥离到单独的符号文件。 我不记得确切的步骤,因为我通常在构建包时让 dh-strip
为我做这件事,但想法是符号不会在程序进程中消耗内存 - 您将它们加载到调试器中。
我想要最好的表现
我该怎么办?
启用优化。
我想要...最详细的调试信息。
我该怎么办?
禁用优化(或者如果您的编译器支持此类选项:仅启用不干扰调试的优化;
-Og
,如果是 g++)并启用调试符号。
您可能会注意到,这些要求是冲突的。
从版本中调试转储的一个不错的折衷方案是启用优化,并启用构建的调试信息,特别是考虑到......
我不在乎程序或任何其他文件的大小。
这是调试信息最受影响的。除非您关心程序的大小,否则无需避免启用调试信息。
为了获得最佳调试信息,请使用这些标志
-O0 -g -rdynamic
这是在 Linux 和 gcc 中
您还需要设置
-fno-omit-frame-pointer
,以便您在调试时知道自己在哪里。它会减慢执行速度,因为有一个可用的寄存器较少,但调试是性能和信息之间的折衷(有时您需要这些来找出编译器在发布模式下假设的东西!)。
CMake 默认使用
-O3
进行发布,使用 -O2 -g
进行带有调试信息的发布(对于调试和分析很有用),因此您有一个良好的开始,只需添加帧指针即可获得更好的上下文。
是的,在生产中进行调试?可怕的。寻找复制者。