【发布时间】:2012-06-30 11:40:11
【问题描述】:
我必须调试一个 c++ 项目,但由于一个依赖项无法在调试模式下编译,并且到目前为止我还无法解决该问题,我想尝试在发布模式下调试该项目。
目前应用程序由于空指针而崩溃,但我没有导致错误的代码。由于在发布模式下显然会忽略断点,我想知道找到错误的最佳方法是什么。
【问题讨论】:
标签: c++ visual-studio-2010 debugging visual-c++ release-mode
我必须调试一个 c++ 项目,但由于一个依赖项无法在调试模式下编译,并且到目前为止我还无法解决该问题,我想尝试在发布模式下调试该项目。
目前应用程序由于空指针而崩溃,但我没有导致错误的代码。由于在发布模式下显然会忽略断点,我想知道找到错误的最佳方法是什么。
【问题讨论】:
标签: c++ visual-studio-2010 debugging visual-c++ release-mode
在 VS 中,右键单击您的项目,选择“属性”。
单击 C/C++ 节点。将调试信息格式设置为 C7 兼容 (/Z7) 或程序数据库 (/Zi)。
展开链接器并单击常规节点。将启用增量链接设置为否 (/INCREMENTAL:NO)。
选择调试节点。将生成调试信息设置为是 (/DEBUG)。
选择优化节点。将引用设置为是 (/OPT:REF)。
如果指定了 /OPT:REF,则 /OPT:ICF 默认开启。
这是直接从微软的文档中摘录的:
我一直这样做,而且几乎不再在调试模式下进行调试。如您所知,发布版本中发生的许多错误可能不会出现在调试版本中(几乎可以肯定是调用 UB 产生的错误)。
另外,我在一个项目中工作,该项目使用大量图像处理并对大图像执行大量压缩/解压缩。使用慢速调试构建根本不切实际。
【讨论】:
您不能总是只更改项目设置并重新编译。
有时您有想要调试的已发布版本,或者客户端发送的转储文件。
在使用优化编译发布的 C++ 项目时,调试器有时不会显示正确的对象信息。
局部变量通常是最先走的,而且很多时候,这个对象的信息会丢失给调试器。
原因是编译器使用可用的硬件寄存器来保存信息,并使用优化来避免分配局部变量。
我建议了一种在此处查找缺失信息的方法:
Debugging Release Projects in C++ - Finding the Lost Object Information
【讨论】: