none
Vistual studio で、外部プログラムから実行した場合のデバッグについて RRS feed

  • 質問

  • Visual Studio 2010を利用しています。

    次の様なシナリオにて、Visual Studioを利用した効果的なデバッグ方法がありましたら

    ご教示ください。

    【シナリオ】

    ・A.exe、B.exe、C.exeというプログラムがある。

    ・A.exeはB.exeを呼び、B.exeはC.exeを呼ぶ。

    ・問題となっているのは、C.exe(ソースあり)。C.exeをVisualStudio上でデバッグしたい。

    現状では、OutputDebugString関数等でデバッグしていくしかないのか、と考えております。

    2014年1月23日 5:37

回答

  • 単純にはC.exeが起動された後、 [デバッグ] - [プロセスにアタッチ] で選択すれば、C.exeのデバッグが開始できます。

    任意タイミング、特にC.exe起動直後をデバッグしたいのであれば、Windows APIのDebugBreak()もしくはCRTの__debugbreak()を呼び出すとそこで停止しデバッガを起動できます。

    • 回答としてマーク hokanabe777 2014年1月23日 12:08
    2014年1月23日 7:33

すべての返信

  • 単純にはC.exeが起動された後、 [デバッグ] - [プロセスにアタッチ] で選択すれば、C.exeのデバッグが開始できます。

    任意タイミング、特にC.exe起動直後をデバッグしたいのであれば、Windows APIのDebugBreak()もしくはCRTの__debugbreak()を呼び出すとそこで停止しデバッガを起動できます。

    • 回答としてマーク hokanabe777 2014年1月23日 12:08
    2014年1月23日 7:33
  • 単純にはC.exeが起動された後、 [デバッグ] - [プロセスにアタッチ] で選択すれば、C.exeのデバッグが開始できます。

    ⇒ありがとうございます!!この方法でデバッグすることが出来ました。

    任意タイミング、特にC.exe起動直後をデバッグしたいのであれば、Windows APIのDebugBreak()もしくはCRTの__debugbreak()を呼び出すとそこで停止しデバッガを起動できます。

    ⇒残念ながらこの方法ではデバッグを行うことが出来ませんでした。

     他のページで見させて頂いた「異常終了ダイアログ」表示中にアタッチする方法になるかと思いますが、OS(WindowsServer2008)のためなのか、OSの設定によるものなのか、、そのダイアログを表示させることができませんでした。

    2014年1月23日 12:21
  • C.exeのソースコードの実行される行にDebugBreak()と書いたのでしょうか? 当該行を実行した際にデバッガーが呼び出されます。これは、最終的にはIntel CPUの機能なので動作しないことはあり得ません。もしかして実行されない行に書き込んだということはありませんか。
    # デバッガで見ると変数などが半角カタカナ「フ」で初期化されていることがありますが、これがプログラムを停止させデバッガーを呼び出す命令です。
    2014年1月23日 13:49
  • 外からでなく、VisualSudio上でC.exe単体を動作させると、異常終了ダイアログが表示されていますので、実行されない行に書いたということは無いかと思っております。

    外から実行すると、異常ダイアログが表示されずに、プログラムが落ちて(終了して)しまいます。

    2014年1月24日 1:06
  • それは勘違いかもしれません。「落ちた」のではなく、

    「C.exe の 0xXXXXXXXX でハンドルされていない例外が発生しました : ユーザー設定のブレークポイント。」

    などの表示のDLGがでませんでしたか。この場合は、

     1.DebugBreak()で止まったので、「中断(B)」ボタンでデバッグできます。

    ということですね。

    デバッグビルドしたexeを、VSからのデバッグ起動でなく、直接起動した場合には、

    「例外 unknown software exception (0x80000003)アプリケーションが0xXXXXXXXXXXXで発生しました。
    プログラムを終了するには「OK」をクリックしてください
    プログラムをデバッグするには「キャンセル」をクリックしてください」

    というDLGが表示されるので

     2.「キャンセル」

    をクリックすれば、既存、又は新規のVSのインスタンスから、
    デバッグを行うことができるはずです。確かめてみてはどうでしょう。

    ちなみに、DebugBreak();の代わりに

    {__asm int 3}

    でも同じことができます。おもしろいですよね(笑)。

    2014年1月24日 1:43