如何检测调试器是否附加*并且*已设置或命中断点?

时间:2011-03-24 16:02:02

标签: .net debugging visual-studio-debugging breakpoints

我知道我可以使用Debugger.IsAttached来检测调试器是否已附加,但我希望能够执行类似

的操作
if (Debugger.IsAttached && Debugger.BreakpointIsSet && Debugger.BreakpointHitCount > 0)
    timeout *= 100;
someEvent.WaitOne(timeout);

原因是我的一些测试场景涉及其他线程上的活动。在调试器下查看事物自然会干扰这个过程。我希望我的主要测试线程阻塞更长时间,而我在其他线程上的断点命中后踩踏,但是如果没有连接调试器就不会阻塞,或者它是一个断点还没有被击中

是否有可能与上述相同;例如,将P / Invoke用于非托管调试API?

3 个答案:

答案 0 :(得分:2)

断点是IDE(Visual Studio)和调试器的功能,而不是.NET框架本身的功能......据我所知,最接近您需要的是使用Visual Studio {{ 3}}功能...

答案 1 :(得分:2)

我不知道这种可能性,但究竟是什么断点已被击中?它暂停执行至少你的断点被攻击的线程。继续执行此操作,你可以使用Thread.ThreadState并检查状态Suspended。为此,您需要引用您感兴趣的线程 免责声明:我不知道,这是否有效或是否有任何副作用,所以即使它有效,也只在调试中使用它,并确保它不在您的生产代码中。

答案 2 :(得分:2)

我不确定我是否完全理解你打算在这里实现的目标 - 但这听起来无论解决方案是什么,它只能说明当你的线程发出信号时每个人真正发生的事情的确定性和混乱另外,这很麻烦,尤其是在连接调试器时。

我会说你最好远离这个调试器并做好''printf debugging',当然还要查看生成每条消息的ThreadID。

那就是说,如果您仍然希望使用调试器,可能只能查看一个线程(仅限一个线程),而其他线程全部被阻止,并监视其系统进入损坏状态时的活动 - 此链接可能对此有帮助: http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/07/17/automatically-freezing-threads-brrrrr.aspx