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

时间:2019-06-18 12:29:59

标签: c++ c++11 gdb g++ coredump

对于我的项目,发行版(与-O2标志一起编译)比调试版(与-g -O0标志一起编译)具有更高的性能。

所以我必须使用发行版。

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

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

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

我该怎么办?

4 个答案:

答案 0 :(得分:3)

-g does not更改生成的代码。它仅添加调试信息。因此,should not影响了性能。

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

优化设置是影响性能的设置。如果需要打开它们,请尝试-Og optimisation setting。它将实现不干扰调试的优化。

最后,生产通常不是调试的好地方。您的其他环境应被设计为重现生产中可能发生的所有错误。目的是确保您永远不会在生产中遇到新的错误。当然,这在实践中非常困难,但是要考虑花费更少的时间来使调试工作在生产环境上,而将更多的时间用于使其他环境紧密匹配,以使您可以识别(也许通过比较日志)然后在此处重现错误。作为一项好处,您可以在生产中发现更多错误。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

  

我想表现最好

     

我该怎么办?

启用优化。

  

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

     

我该怎么办?

禁用优化(或如果编译器支持此类选项:仅启用不会干扰调试的优化;对于g ++,则启用-Og)并启用调试符号。

您可能会注意到,这些要求存在冲突。

调试版本中的转储的一个不错的折衷办法是同时启用优化和启用构建的调试信息,尤其是考虑到...

  

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

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

答案 3 :(得分:-1)

您还希望设置-fno-omit-frame-pointer,以便在调试时知道自己的位置。

> p>

>

>

>

默认情况下,CMake使用-O3进行发布,并使用-O2 -g进行发布,并附带调试信息(用于调试和概要分析),因此您有一个很好的开始,只需添加帧指针以拥有更好的上下文

是的,在生产中进行调试?害怕。找到一个复制者。