0

私は自分が書いたのではないプログラムのコードをステップスルーしようとしています(私はソースを持っています)。小さなhttpサーバーです。ブレークポイントを配置することができ、ブレークポイントはからの線形パスで実行される任意のポイントで尊重されますmain()。ただし、ブラウザからの接続に応答して呼び出される行にブレークポイントを設定しようとすると、無視されます。

ソケットコードのデバッグについて私が知らないことがありますか?私はソケットプログラミングについてあまりよく知りませんが、それは私が見ようとしている部分ではありません。

これは、Visual C++2010の場合です。

編集
私は問題を見つけました。深くネストされた呼び出しがsystemあり、実際には異なるパラメーターを使用してプログラムを再度実行していました。つまり、スレッドやソケットなどではなく、実際にはまったく新しい子プロセスです。デバッガーにこれを続行させる方法はありますか?

4

1 に答える 1

1

オプション1

「system」呼び出しを変更して、「-waitfordebugger」パラメーターを子プロセスに渡します。次に、mainまたはWinMainで、この引数に渡されたコマンドライン引数を確認します。検出された場合は、コードを無限ループにします。

volatile int x = false;
while (x == false)
{
    Sleep(100);
}

子プロセスが生成されたら、Visual Studioを使用して子プロセスに「アタッチ」します(トップレベルメニューで、[デバッグ]と[プロセスにアタッチ...]を選択します)。次に、Sleepステートメントにブレークポイントを設定します。ブレークポイントに到達したら(すぐに実行する必要があります)、ウォッチウィンドウの「x」をtrueに変更し、新しいブレークポイントをコード内のステップスルーする場所に設定します。次に、「続行」(F5)キーを押して、プログラムを続行します。

IsDebuggerPresent()APIがTRUEを返すまで待機する方法など、この手法には他にもバリエーションがあります。

オプション2

デバッグするコードの場所の近くに、DebugBreak()ステートメントを挿入します。これにより、通常、ポップして開くクラッシュダイアログが作成されます。デバッガーを接続するように求められた場合は、それを許可します。それ以外の場合は、オプション1の説明に従ってデバッガーを直接接続し、クラッシュダイアログの適切なボタンを押して続行します。このアプローチのYMMVは、どのタイプの例外ハンドラーが既にインストールされているか、および/またはシステム関数呼び出しがクラッシュを非表示にするように設定されているかどうかによって異なります。

于 2012-06-13T06:35:23.610 に答える