1

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

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

原因是我的一些测试场景涉及其他线程上的活动。在调试器下查看东西自然会扰乱这个过程。我希望我的主测试线程在我在某个其他线程上的断点命中后单步执行时阻塞更长时间,但如果没有附加调试器,或者它是但尚未命中断点,则不会阻塞.

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

4

3 回答 3

2

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

于 2011-03-24T16:16:37.310 回答
2

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

于 2011-03-24T16:23:34.950 回答
2

我不确定我是否完全理解您计划在这里实现的目标 - 但听起来可能会制定任何解决方案,它只会阐述当您的线程相互发出信号时实际发生的事情的确定性和混淆,这就这样已经足够令人困惑了,尤其是在附加调试器时。

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

也就是说,如果您仍希望为此使用调试器,则仅查看一个线程(并且仅查看一个线程)而其他线程都被阻塞并在系统进入损坏状态时监视其活动可能会很有用 - 这链接可能对此有所帮助:http: //www.wintellect.com/CS/blogs/jrobbins/archive/2009/07/17/automatically-freezing-threads-brrrrr.aspx

于 2011-03-24T23:36:48.947 回答