適切な時点で VC++ のプロセスにデバッガーを接続する最善の方法は何ですか?
-
20-08-2019 - |
質問
デバッグするとき、デバッガーでアプリケーションを開始するだけでなく、すでに実行中のプロセスをアタッチする必要がある場合があります。
私自身は、デバッガーを接続しやすくするために、Sleep() または MessageBox 呼び出しを入れるのが一般的です。これらの一部が最終的にソース管理にコミットされるのではないかと心配しています。
実行中のプロセスにデバッガをアタッチできるように十分な時間を遅らせながら、この状況を回避するには何が最善の策でしょうか?
スリープ ボックスまたはメッセージ ボックスを保護する #ifdef _DEBUG
それは一つの方法ですが、もっと良い方法があるかどうか疑問に思っています。
スリープでは、時間内に接続できない可能性があるという問題もあります。MessageBox を使用すると、リモートでデバッグしたり、GUI が表示されないプロセス (Vista でサービスとして実行されている例) をデバッグしたりする可能性があるという問題があります。
解決
あなたはこれらのリンクをチェックし、にDebugBreakを使用することができます:
http://www.epsilon-delta.net/記事/ vc6_debug.html番号破壊-と-にDebugBreakする
http://blogs.msdn.com/calvin_hsia/アーカイブ/ 2006/8月25日/ 724572.aspxする
他のヒント
特定のポイントでデバッガをアタッチするには、いくつかのオプションがあります:
最も簡単なのは(私が正しくリコール場合のx64用MSVCは、インラインアセンブリを許可していません)DebugBreak
するほとんど同じですが、また、他のアーキテクチャ上で動作され、ちょうど__asm int 3
呼び出すことです。これは、ジャストインタイムデバッガウィンドウを開きます、そしてあなたがプロセスにアタッチするために登録されたデバッガ(すなわち、Visual Studioの)から選択することができます。
また、あなたはあなたにデバッガを接続する機会を与え、Sleep
するための呼び出しを導入することができます。含まれています。
#ifdef _DEBUG
使用する必要があります
一つの質問:なぜあなたはIDEからコードを実行することはできませんか?それは、サービスまたはIIS-ロードDLLまたは類似しているのですか?
この場合、あなたは、プロセスが開始される瞬間に、デバッガをアタッチすることができますImageFileExecutionOptions
レジストリキーを、チェックアウトすることができます。
あなたがこのためにCDBを使用している場合は、サーバーまたはクライアントWinDbgのインスタンスに、そして道デバッグのいずれかとして設定することができます。私は、カーネルデバッガとしてWinDbgのを使用して、名前付きプロセスをntsd -d
開始するImageFileExecutionOptionsを使用することにより、過去にこれをやりました。これは、ユーザーモードに侵入するのWinDbgの原因となります。これは時々有用な技術である。
私は時々使う他の変形は、ある
while( !::IsDebuggerPresent() )
::Sleep( 100 ); // to avoid 100% CPU load
あなたがプロセスにデバッガをアタッチするまで、それだけで静かに待機しなければならない。
フレディとレオアは正しい解決策を持っています。しかし、メッセージボックスを使用しない理由を追加したいと思いました。
メッセージ ボックスを表示しても、アプリケーションは部分的にのみ停止します。UI を表示しているため、プログラム内の少なくとも 1 つのスレッドでメッセージ ポンプがまだ実行されています。したがって、コードが次のいずれかを実行するとします。
- Windows メッセージ経由で通信します
- 単純ではない UI がある
- マルチスレッドである
基本的に、ある状態でデバッガをリクエストしますが、プログラムにはまったく異なる状態でアタッチします。これにより、困惑した状況やバグが発生する可能性があります。
私たちは最近、まさにこの理由から中断を容易にするために、メッセージ ボックスを表示しないようにコード ベースを変更しました。これは、重要なアプリケーションに対して非常に悪い動作を引き起こします。
「ちょうどポイント」に接続する持つことは、痛みは1つのオプションが、コードに明示的にDebugBreak()文は、問題を強制することです...で、#ifdef _DEBUG
でそれらを守ることは良いでしょう。我々はにDebugBreak()を呼び出すことができますassertマクロを使用するので、あなただけのASSERT(偽)
考慮すべきもう一つのオプションは、自動的にデバッガを起動するには「イメージファイルの実行オプション」を使用しています。このブログを参照してくださいMSDN のドキュメントnoreferrer">
見上げてます: にDebugBreak、__debugbreakや友人 または 静的ボイドtimeToChase(){__asm {INT 3。 }。 }
__asm int 3
このハードブレークポイントを使用すると、プロセスにアタッチできるようになるデバッグダイアログを、開きます。デバッグビルドでの#ifdef _DEBUGでそれをラップし、あなただけそれを打つでしょう。