【问题标题】:Break point in release mode释放模式下的断点
【发布时间】:2012-02-10 07:01:16
【问题描述】:

我正在使用 (C++) Visual Studio 2010。

我必须跟踪我的应用程序的控制流。为此,我在源代码中设置了一个断点。

在调试模式下运行应用程序时,断点命中。但是在发布模式下它没有命中。

在Release模式下调试时如何触发断点?

【问题讨论】:

  • 没办法。这就是调试模式的实际用途(原因之一)。为什么要在发布模式下打断点?
  • “发布”模式启用可以(并且经常这样做)破坏代码流的优化。在启用优化的情况下很难看到问题发生,这就是为什么在“调试”模式下没有启用它们。程序员通常使用它来进行调试。您在调试模式下没有看到您要解决的问题吗?
  • 编程语言是什么?
  • 编程语言无关。它们都支持可能改变程序流程的优化。 “调试”模式的存在是有原因的,并且名称不是从帽子中提取的。
  • @Cody:优化使调试变得更加困难,但它们并不能完全防止遇到断点。不为 C++ 构建生成调试信息/ rogram 数据库 - 相反 - 确实会阻止。

标签: visual-studio-2010 visual-c++


【解决方案1】:

我正在使用 VS2015。 在许多失败的解决方案之后,我找到了一个对我有用的解决方案。 只需取消选中菜单->调试->选项->调试->常规下的“仅启用我的代码”。 见附图: enable debug in release mode-VS2015

我真的希望这能解决你的问题:)

【讨论】:

  • 我遇到了一个问题,即进行调试构建时会出现 LNK1104 致命错误(无法打开 exe)。发布正在构建,但在断点处停止。取消选中此设置现在允许构建我的调试版本。现在两种构建类型都停止了断点。
【解决方案2】:

发布模式断点可以方便地开始工作。让它工作的最简单方法是在你的代码中调用一个名为release_mode_breakpoint() 的函数。然后像这样定义该函数:

#pragma optimize("", off)
void release_mode_breakpoint()
{
    int put_breakpoint_here = 1;
}
#pragma optimize("", on)

然后您可以在该 int 声明行上放置一个断点,它会被命中,即使在发布模式下也是如此。然后只需将调试器中的堆栈逐步返回到您实际想要断点的函数。

但实际上不要将该代码留在您的最终生产版本中,因为未优化的行可能会阻止编译器正确优化调用代码。

【讨论】:

    【解决方案3】:

    您可以使用 __debugbreak() 内在函数。如果您想在特定条件下中断,这也非常方便。例如:

    if (var > LIMIT)
      __debugbreak();
    

    【讨论】:

      【解决方案4】:

      在发布模式下,您的代码已经过优化,可以改变程序的流程。例如,如果一个函数很简单,只调用一次,编译器可以在release模式下内联函数。

      调试模式没有这种优化,专为调试代码而设计。

      【讨论】:

        猜你喜欢
        • 2013-06-24
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 2020-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多