【问题标题】:Breaking During Function Evaluation in the Debugger在调试器中的函数评估期间中断
【发布时间】:2013-06-24 22:25:23
【问题描述】:

我正在努力让它工作: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() 应该触发断点的事实)。

这是预期的行为吗?这似乎与文档所说的完全相反......我误解了什么吗?

【问题讨论】:

  • 好吧,我看了一下,我和你一样困惑。即使文档暗示它应该发生,也不会发生中断。

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


【解决方案1】:

嗯,这确实有效,只是不是您希望的那样有效。把函数改成这样:

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() 语句。本机代码中没有类似的东西,托管代码是工具构建者的乐趣。

【讨论】:

  • 所以如果函数有一些像int j=2; 这样无害的东西而不是DebugBreak(),这会起作用吗?
  • 很难观察,但可以肯定。您还会看到“之后”。试试看。
  • 谢谢!这澄清了事情......文档可能更清楚地说明这适用于哪个环境,还有另一个页面我现在找不到了,这给我的印象是这适用于托管代码和本机代码。
  • 找到它:msdn.microsoft.com/en-us/library/83hd8f1e%28v=vs.100%29.aspx 我想它的意图是说它适用于托管 C++,但这当然可以更清楚:p
  • 您可以在 connect.microsoft.com 报告文档错误报告
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多