在没有 -g 选项的情况下编译,但我想获得更详细的调试信息
Compile without -g option but I want to get more detailed debug info
对于我的项目,发布版本(使用-O2
标志编译)比调试版本(使用-g -O0
标志编译)具有更高的性能。
所以我必须使用发布版本。
但是,在生产环境中,发布程序有时会生成核心转储。
然后,我使用gdb xxx core
调试核心转储文件,但没有足够的信息供我使用。
我不在乎程序或任何其他文件的大小。我想要最好的性能和最详细的调试信息。
我该怎么办?
-g
不会更改生成的代码。它仅添加调试信息。因此,它不应影响性能。
您应该调查为什么会看到性能差异 - 这可能会揭示一些有用的信息。
优化设置是影响效果的设置。如果您需要启用它们,请尝试-Og
优化设置。它将实现不干扰调试的优化。
最后,生产通常不是一个调试的好地方。您的其他环境应设计为重现生产环境中可能发生的所有 bug。目标是确保您永远不会在生产环境中遇到新的错误。当然,在实践中非常困难,但请考虑花更少的时间让调试在生产环境中工作,而花更多的时间让你的其他环境如此紧密地匹配,以便你可以识别(也许通过比较日志)然后在那里重现错误。作为一项好处,您将在更多错误进入生产环境之前捕获它们。
你应该使用-g -O2
进行编译,并且(如果你确定有必要的话),将调试符号剥离到一个单独的符号文件中。 我不记得确切的步骤,因为我通常在构建包时dh-strip
让我这样做,但这个想法是符号在程序过程中不会消耗内存 - 将它们加载到调试器中。
我想要最好的性能
我该怎么办?
启用优化。
我想。。。最详细的调试信息。
我该怎么办?
禁用优化(或者如果您的编译器支持此类选项:仅启用不影响调试的优化;-Og
在 g++ 的情况下)并启用调试符号。
您可能会注意到,这些要求是冲突的。
从发布中调试转储的一个体面的折衷方案是启用优化,并为构建启用调试信息,特别是考虑到......
我不在乎程序或任何其他文件的大小。
这是调试信息主要影响的内容。除非您关心程序的大小,否则无需避免启用调试信息。
您还希望设置-fno-omit-frame-pointer
,以便在调试时知道自己的位置。它会减慢执行速度,因为可用的寄存器较少,但调试是性能和信息之间的折衷(有时您需要这些来发现编译器在发布模式下假设了事情!
CMake 默认使用-O3
发布,-O2 -g
发布,其中包含调试信息(对于调试和分析很有用),因此您有一个良好的开端,只需添加帧指针即可获得更好的上下文。
是的,在生产中调试?可怕。查找复制者。
- 调试符号中缺少 QObject 类信息(编辑但存在其他 Qt 类)
- 创建进行生产构建并创建调试信息的C++生成文件的最佳方法?
- 在源文件中包含额外的调试信息,以便在代码::块中使用gdb进行调试
- Boost tread 代码在 VC++ 下编译,但不在 GCC 下编译:如何获得更好的调试信息
- 错误 VSP1011:无法获取调试信息.与 /配置文件链接器开关链接
- 在没有 -g 选项的情况下编译,但我想获得更详细的调试信息
- cmake/cpack 组件调试信息 rpm 包未出现
- LLDB - Qt 缺少调试信息
- C++ ATIOGLXX.pdb 包含查找模块 ATIOGLXX.dll 源代码所需的调试信息
- 如何将调试信息附加到LLVM通行证中的指令中
- 由procexp(MS process explorer)创建的VC10调试转储文件-只有堆栈信息,没有变量值
- 从LLVM IR获取精确的行/列调试信息
- Visual Studio-使用PDB进行调试,但缺少类型信息
- 二进制不是使用 Visual Studio 2008 中的调试信息构建的
- 如何使dumpObjectInfo打印调试信息
- 找不到"mpiexec"的调试信息或不匹配。找不到或打开 PDB 文件
- g++未在调试信息中进行编译
- visualstudio可以使用gcc生成的调试信息吗
- 使用Visual C++在单独的文件中提取调试信息
- 警告LNK4206:找不到预编译类型信息; 未链接或覆盖;链接对象,就好像没有调试信息一样