15

デバッグ時には、デバッガーでアプリケーションを起動するだけでなく、すでに実行中のプロセスをアタッチする必要がある場合があります。

デバッガーを簡単に接続できるように、Sleep()またはMessageBox呼び出しを行うのが一般的です。これらのいくつかが最終的にソース管理にコミットされるのではないかと心配しています。

実行中のプロセスにデバッガーを接続できるように十分な時間を遅らせながら、この状況を回避するための最善の方法は何ですか?

スリープまたはメッセージボックスをで保護すること#ifdef _DEBUGは1つの方法ですが、もっと良い方法があるかどうか疑問に思っています。

スリープを使用すると、時間内にアタッチできない可能性があるという問題もあります。MessageBoxを使用すると、リモートでデバッグしている、またはGUIが表示されていないプロセスをデバッグしている可能性があるという問題があります(Vistaでサービスとして実行されている例)。

4

8 に答える 8

17

私が時々使用する別のバリ​​アントは

while( !::IsDebuggerPresent() )
    ::Sleep( 100 ); // to avoid 100% CPU load

デバッガーをプロセスにアタッチするまで黙って待つ必要があります。

于 2016-01-26T15:51:07.020 に答える
11

DebugBreak を使用できます。次のリンクを確認してください。

http://www.epsilon-delta.net/articles/vc6_debug.html#breaking-with-debugbreak

http://blogs.msdn.com/calvin_hsia/archive/2006/08/25/724572.aspx

于 2009-03-19T18:43:04.560 に答える
9

特定の時点でデバッガーをアタッチするには、いくつかのオプションがあります。

最も簡単なのは を呼び出すDebugBreakことです。これは とほとんど同じですが__asm int 3、他のアーキテクチャでも機能します (私の記憶が正しければ、x64 用の MSVC はインライン アセンブリを許可していません)。これにより、ジャストインタイム デバッガー ウィンドウが表示され、登録済みのデバッガー (つまり、Visual Studio) から選択してプロセスにアタッチできます。

または、 への呼び出しを導入してSleep、デバッガをアタッチする機会を与えることができます。#ifdef _DEBUGこのコードを含めて実際に出荷しないようにするために、これを回避する必要があります。

1 つの質問: IDE からコードを実行できないのはなぜですか? それはサービスですか、それとも IIS で読み込まれた DLL ですか?

この場合、ImageFileExecutionOptionsレジストリ キーをチェックアウトできます。これにより、プロセスの開始時にデバッガーをアタッチできます。

これに cdb を使用する場合は、それをサーバーまたはクライアントとして WinDbg インスタンスに構成し、その方法でデバッグできます。私はこれまで、WinDbg をカーネル デバッガとして使用し、ImageFileExecutionOptions を使用ntsd -dして名前付きプロセスを開始することでこれを行ってきました。これにより、WinDbg がユーザー モードに突入します。これは便利なテクニックです。

于 2009-03-19T18:54:53.720 に答える
2

「ちょうどいいポイント」にアタッチしなければならないのは面倒です... 1つのオプションは、コードに明示的な DebugBreak() ステートメントを挿入して問題を強制することであり、それらを保護する#ifdef _DEBUGことは良い考えです。DebugBreak() を呼び出すことができる ASSERT マクロを使用するため、ASSERT(false) を記述するだけで済みます。

考慮すべきもう 1 つのオプションは、「イメージ ファイル実行オプション」を使用してデバッガーを自動的に起動することです。このブログMSDNドキュメントを参照してください。

于 2009-03-19T18:44:43.217 に答える
1

調べる:

DebugBreak 、 __debugbreak など

また

static void timeToChase() { __asm { int 3; }; }

于 2009-03-19T18:43:21.097 に答える
1
__asm int 3 

このハード ブレークポイントによってデバッグ ダイアログが表示され、プロセスにアタッチできます。これを #ifdef _DEBUG でラップすると、デバッグ ビルドでのみヒットします。

于 2009-03-19T18:44:55.523 に答える