デバッガーで CLR 例外の中断をすばやく切り替える拡張機能を作成したいと考えています。
私はいくつかのアプローチを試みましたが、どちらも満足のいくものではありませんでした。
これが私がすでに試したことです:
ExceptionSettings.SetBreakWhenThrown
( MSDN )
これは非常に遅いです (この Connect issueを参照してください)。質問からのアプローチを試みました」トグル「例外がスローされたときにブレークします。」ほとんどの場合、トップレベルのチェックボックスのみが設定され、デバッグ時に例外で実際に中断することはありません。DTE.ExecuteCommand("Debug.Exceptions")
ウィンドウを表示するために呼び出し、その直前にSetWindowsHookEx
( MSDN ) を呼び出して、表示される前にインターセプトします (ユーザーにフラッシュがないように)。メッセージを傍受して取得できたので、これは可能だと思われますHWND
。しかし、ハックしているようで、ウィンドウを適切に操作するのはそれほど簡単ではありません (SysListView32
カスタム チェックボックスとの奇妙な組み合わせがありますSysTreeView32
)。だから私はそれを最後のチャンスの解決策として残しています。どういうわけか、マネージ コードの取得
IDebugEngine2
( MSDN )と、デバッグ セッションの開始時に呼び出しIDebugEngine2.SetException
( MSDN ) を行います。これは可能だと思われますが、デバッグ エンジンの取得に問題があります。MSDN フォーラムIVsLoader
で説明されている方法を試してみましたが、デバッグ セッションとは無関係の新しいインスタンスが得られると確信しています。ここでも質問をしました:「Visual Studio:VSパッケージからIDebugEngine2を取得する方法(IVsLoaderを除く)」ですが、解決策が得られませんでした。
IVsDebugger.AdviseDebugEventCallback
(MSDNIDebugEventCallback2
)を使用して(MSDN)の実装を渡そうとしましたが、常に取得null
していますpEngine
(どちらも取得していませんIDebugEngineCreateEvent2
)。私は
IDebugSessionCreateEvent2
(文書化されていませんか?)それから取得できますIDebugSession2
が、その呼び出しは常に間違った引数をSetException
与えるため、ここで何かが欠けている可能性があります(エンジンからの呼び出しはOKを返しますが、うまくいきません)。HRESULT
SetException
IVsLoader
それらよりも優れた他のアプローチはありますか、それとも既存のもので何かを見逃していますか?
更新/注:
「すべての例外でブレーク」を高速化するためにこの質問を見つけた場合は、Visual Studio ギャラリーから入手できる無料の拡張機能を作成しました: Exception Breaker。