【问题标题】:How can I detect whether a debugger is attached *and* a breakpoint has been set or hit?如何检测是否附加了调试器*并且*已设置或命中断点?
【发布时间】:2011-03-24 16:02:02
【问题描述】:

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

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

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

是否与上述可能的等价;例如,对非托管调试 API 使用 P/Invoke?

【问题讨论】:

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


    【解决方案1】:

    我不确定我是否完全理解您计划在这里实现的目标 - 但听起来好像可以制定任何解决方案,它只会阐述当您的线程发出信号时实际发生的事情的确定性和混乱其他,这很令人困惑,尤其是在附加调试器时。

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

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

    【讨论】:

    • 我以前用过冻结线程。我不知道为什么在这种情况下我没有想到。主要是我想以最少的努力阻止测试退出。 freeze-all-but-this 宏看起来是一个很好的方法。
    【解决方案2】:

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

    【讨论】:

    • 是的,但我想知道是否有办法调出调试器本身并询问它?设置条件断点很好,我正在寻找从代码本身检测断点。
    【解决方案3】:

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

    【讨论】:

    • 有趣的可能性,而且绝对不希望在生产代码中出现这种情况!
    • @Kit:这就是我要说的! ;-) 你可以通过conditional compilation 来确保它
    • 我没有展示它,但该块在 #if TEST 指令中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多