调试器中功能评估期间的突破

时间:2013-06-24 22:25:23

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

我正试图让这个工作:http://msdn.microsoft.com/en-us/library/ms171381%28v=vs.100%29.aspx

更具体地说,正如所提到的on this other page,当使用立即窗口调用方法时,“如果函数或子例程包含断点,Visual Studio将在适当的位置中断执行。

除了......它没有,至少对我而言。你可以尝试使用这个虚拟c ++测试用例:

#include "Windows.h"

void dbgbreak()
{
    DebugBreak(); // set a second breakpoint here
}

int main ()
{
    int i = 0;
    i++; // set a first breakpoint here
    return i;
}

设置源中提到的断点并运行。当调试器停在 i ++ 时,从即时窗口调用 dbgbreak()

对我来说,调试器不会再次停止,即使有两个原因(调用方法中的显式第二个断点,加上win32 API DebugBreak()应该触发断点)。

这是预期的行为吗?这似乎与文档所说的完全相反......我是否误解了某些内容?

1 个答案:

答案 0 :(得分:3)

嗯,这确实有效,而不是你希望它的工作方式。将功能更改为:

void dbgbreak()
{
    OutputDebugString(L"Before\n");
    DebugBreak();
    OutputDebugString(L"After\n");
}

当我使用立即窗口时,我看到了:

dbgbreak()
Before
The evaluation was aborted because an unhandled exception occurred.

这非常准确,DebugBreak()会生成异常。调试器通常拦截哪个程序将程序置于中断状态。问题是,它已经处于休息状态。缺少的功能是调试器不支持嵌套中断状态。因为Windows调试api不支持它,所以它可以被宽恕,这应该是很难实现的。

请注意,您链接的MSDN页面会讨论托管代码。它使用了一种非常不同的调试器。 CLR启动一个调试器用于评估监视表达式和立即命令的专用线程,这有很大帮助。并支持Debugger.Break()语句。在本机代码中没有类似的东西,托管代码是工具构建者的喜悦。