【问题标题】:How to debug in release mode?如何在发布模式下调试?
【发布时间】:2012-06-30 11:40:11
【问题描述】:

我必须调试一个 c++ 项目,但由于一个依赖项无法在调试模式下编译,并且到目前为止我还无法解决该问题,我想尝试在发布模式下调试该项目。

目前应用程序由于空指针而崩溃,但我没有导致错误的代码。由于在发布模式下显然会忽略断点,我想知道找到错误的最佳方法是什么。

【问题讨论】:

    标签: c++ visual-studio-2010 debugging visual-c++ release-mode


    【解决方案1】:

    在 VS 中,右键单击您的项目,选择“属性”。

    1. 单击 C/C++ 节点。将调试信息格式设置为 C7 兼容 (/Z7) 或程序数据库 (/Zi)。

    2. 展开链接器并单击常规节点。将启用增量链接设置为否 (/INCREMENTAL:NO)。

    3. 选择调试节点。将生成调试信息设置为是 (/DEBUG)。

    4. 选择优化节点。将引用设置为是 (/OPT:REF)。

      如果指定了 /OPT:REF,则 /OPT:ICF 默认开启。

    这是直接从微软的文档中摘录的:

    我一直这样做,而且几乎不再在调试模式下进行调试。如您所知,发布版本中发生的许多错误可能不会出现在调试版本中(几乎可以肯定是调用 UB 产生的错误)。

    另外,我在一个项目中工作,该项目使用大量图像处理并对大图像执行大量压缩/解压缩。使用慢速调试构建根本不切实际。

    【讨论】:

    • 感谢问题已解决!我对所有这些设置的影响不是很了解,所以最好只使用它们进行调试并在编译实际发布版本时再次删除它们?
    • @Pedro:是的,最好恢复它们并保留发布的默认值。我通常为这个配置创建一个新的构建类型,即“release w/symbols”。也就是说,去研究这些开关的实际作用并没有什么坏处。
    • @EdS。好吧(实际上是对英特尔视觉 fortran 的改编)让我很开心! (我通过从发行版复制创建了一个新配置,并更改了需要更改的内容。)我理解为什么执行 F10 不会线性执行代码(我猜仍然会发生其他一些优化)但我不明白的是为什么有些行会被多次传递,比如声明/初始化等。
    • 因为这些行在发布版本中不存在。它们已经过优化。
    • @Eds:谢谢。好吧,这肯定行得通。我在发布模式下意外崩溃。我的许多函数都超出了 16KB 的堆栈限制,我怀疑这可能是原因(警告 C6262)。但在进行任何自我优化之前,我在发布时使用 /OPT:REF 修改了构建属性,它就运行了。我猜 C6262 的移除也很重要。 docs.microsoft.com/en-us/visualstudio/code-quality/…
    【解决方案2】:

    您不能总是只更改项目设置并重新编译。
    有时您有想要调试的已发布版本,或者客户端发送的转储文件。

    在使用优化编译发布的 C++ 项目时,调试器有时不会显示正确的对象信息。

    局部变量通常是最先走的,而且很多时候,这个对象的信息会丢失给调试器。

    原因是编译器使用可用的硬件寄存器来保存信息,并使用优化来避免分配局部变量。

    我建议了一种在此处查找缺失信息的方法:

    Debugging Release Projects in C++ - Finding the Lost Object Information

    【讨论】:

    • @Ed 的回答非常好,如果您可以访问代码和 IDE。洋柴的回答值得一读。
    猜你喜欢
    • 2014-02-18
    • 2011-09-02
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多