发布模式下的断点调试问题

17

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

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

在调试模式下运行应用程序时,断点会触发。但在发布模式下不会触发。

如何使断点在发布模式下也能被触发?


不行。这正是调试模式存在的原因之一。你为什么想在发布模式下触发断点? - Sergey Kudriavtsev
1
“Release”模式启用了优化功能,这可能会(并经常会)破坏代码的流程。在启用优化时观察问题变得非常困难,这就是为什么它们不在“Debug”模式下启用的原因。程序员通常使用调试模式进行调试。您在调试模式下看不到要解决的问题吗? - Cody Gray
1
编程语言是什么? - Roman R.
编程语言并不重要。它们都支持可能改变程序流程的优化。"调试"模式是有原因的,而且这个名字不是随便取的。 - Cody Gray
2
@Cody:优化使得调试更加困难,但并不完全防止触发断点。相反,不为 C++ 构建生成调试信息/程序数据库的做法会导致无法触发断点。 - Roman R.
是的,对于任何语言,不为构建生成调试信息都有这种影响。但“发布”模式和调试信息的生成彼此独立。我不知道你想说什么。是的,我同意,这个问题很差而且不完整。但这不太重要,无论是C++还是VB.NET。 - Cody Gray
4个回答

24

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

希望这个方法能够解决您的问题 :)


我遇到了一个问题,进行调试构建时出现LNK1104致命错误(无法打开exe)。发布版本正在构建,但在断点处停止。取消此设置现在允许我的调试构建进行构建。现在两种构建类型都会在断点处停止。 - DusX
@user1988918 已经取消勾选,但仍无法触发断点... - Grace

10
在发布模式下,您的代码会被优化,这可能会改变程序的流程。例如,如果一个函数很简单而且只被调用一次,在发布模式下编译器可以将该函数内联。
调试模式没有这些类型的优化,它专为调试您的代码而设计。

7

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

if (var > LIMIT)
  __debugbreak();

5

发布模式下的断点非常方便。让它起作用的最简单方法是在您的代码中调用一个名为release_mode_breakpoint()的函数。然后像这样定义该函数:

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

您可以在该int声明行上设置断点,即使在发布模式下也会触发。然后,在调试器中向上逐步堆栈,返回到您实际想要设置断点的函数。
但请不要在最终生产版本中留下该代码,因为未经优化的代码行可能会妨碍编译器正确优化调用代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接