1

Debugger.IsAttachedを使用してデバッガーがアタッチされているかどうかを検出できることはわかっていますが、次のようなことができるようにしたいと考えています。

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

その理由は、私のテスト シナリオの一部に、他のスレッドでのアクティビティが含まれているためです。デバッガーの下で物事を表示すると、当然、このプロセスが妨げられます。他のスレッドでブレークポイントにヒットした後にステップしている間、メインのテスト スレッドをより長くブロックしたいのですが、デバッガーが接続されていない場合、またはデバッガーが接続されているがブレークポイントがまだヒットされていない場合は、ブロックしないでください。 .

上記の可能性と同等のものはありますか; たとえば、P/Invoke をアンマネージ デバッグ API に使用しますか?

4

3 に答える 3

2

ここで何を達成しようとしているのかを完全に理解しているかどうかはわかりませんが、どのような解決策が考えられるかはわかりませんが、スレッドが互いに信号を送るときに実際に何が起こっているのかについての確実性と混乱について説明するだけです。特にデバッガーを接続する場合は、そのままで十分に混乱します。

これについては、デバッガーから離れて、古き良き「printfデバッグ」を行い、もちろん、各メッセージが生成されたThreadIDを確認する方がよいと思います。

とはいえ、これにデバッガを使用したい場合は、他のスレッドがすべてブロックされている間に 1 つのスレッド (および 1 つのスレッドのみ) を調べ、システムが破損した状態になったときにそのアクティビティを監視すると便利な場合があります。リンクはそのために役立つかもしれません: http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/07/17/automatically-freezing-threads-brrrrr.aspx

于 2011-03-24T23:36:48.947 に答える
2

ブレークポイントは、.NET フレームワーク自体ではなく、IDE (Visual Studio) とデバッガーの機能です...私の知る限り、必要なものに最も近いのは、Visual Studioの「ブレークポイント条件」機能を使用することです。 ...

于 2011-03-24T16:16:37.310 に答える
2

そのような可能性は認識していませんが、ヒットしたブレークポイントとは正確には何ですか? 少なくともブレークポイントがヒットしたスレッドの実行が一時停止されます。これから続けて、おそらくThread.ThreadStateを使用して状態を確認できますSuspended。これが機能するには、関心のあるスレッドへの参照が必要です。
免責事項:これが機能するかどうか、またはこれに副作用があるかどうかはわかりません。したがって、機能する場合でも、デバッグでのみ使用し、本番コードに含まれていないことを確認してください。

于 2011-03-24T16:23:34.950 に答える