ソリューション内の実行ファイルから起動した実行ファイルのデバッグ

[戻る]
亀山 2014/12/09(火) 11:37:48
連投失礼します。

さまざまなコマンドラインオプションを持つ実行ファイル(A.exe)を作成していて、
そこで指定された動作をデバッグでテストしたいと思っています。
テスト中は、様々なコマンドラインを行ったり来たりすることになります。

A.exeのプロジェクト設定でコマンドラインを変更すれば可能なことはわかりますが、
テストする動作を変更するたびにプロジェクト設定を書き換えないといけません。

そのため、多くのコマンドラインをあらかじめコンボボックスなどに入れておき、
簡単に切り替えてA.exeをCreateProcess()などで起動する実行ファイル(B.exe)を
ソリューション内に作成し、こちらのほうをデバッグ開始で実行しようとしました。

ところがこの方法だと、今度はデバッグ動作中のB.exeからA.exeを起動するたびに、
プロセスにアタッチし直さなければいけなくなります。

B.exeのデバッグ中に起動された同一ソリューション内のA.exeを
自動で現在のソリューションにアタッチしてくれる設定方法はあるのでしょうか?

もしくは、もっと簡単に多くのコマンドラインオプションを変更しながら
デバッグできる方法はありますでしょうか?

aetos 2014/12/09(火) 15:53:14
こんなアドインを使用してみるのはいかがでしょうか。若干楽になります。

子プロセスを自動的にデバッグ対象にしてくれる:
https://visualstudiogallery.msdn.microsoft.com/a1141bff-463f-465f-9b6d-d29b7b503
d7a

デバッグ用コマンドライン切り替え:
https://visualstudiogallery.msdn.microsoft.com/b54410f3-90aa-4071-abb3-215efea48
074

亀山 2014/12/11(木) 09:38:12
[[解決]]
aetosさん、情報ありがとうございます。
マイクロソフトの社員(?)がこのような方法を公開するということは、
正式に子プロセスをデバッグできる方法というのは存在しないのでしょうかね。

現在の開発環境が2008や2010なので、
そのまま利用することはできないかもしれませんが、
こういう手法もあることがわかったので、
そちらのほうもいろいろ試してみたいと思います。

aetos 2014/12/11(木) 11:16:44
# 何の解決策でもありません、と最初にお断りして、仕組みの話などを少々…

CreateProcess を呼び出すときに DEBUG_PROCESS フラグを指定し、かつ DEBUG_ONLY_THI
S_PROCESS フラグを指定しなければ、CreateProcess で起動したプロセスがさらに別の子
プロセスを立ち上げた場合、子プロセスも自動的にデバッグ対象になります。

というのは、デバッガーを作る場合の話。

1)DEBUG_PROCESS を指定して CreateProcess するアプリ=デバッガー=VS
   ↓
2)デバッグされるアプリが CreateProcess で子プロセスを起動
 この時には(このアプリはデバッガーではないので)DEBUG_PROCESS は指定しない
   ↓
3) (1) のデバッガーが DEBUG_ONLY_THIS_PROCESS を指定していなければ、
 ここで起動された子プロセスも自動的に (1) のデバッガーのデバッグ対象になる

今作ろうとしているアプリは (2) と (3) にあたります。

つまり、VS はデバッグ対象のアプリを起動する時に、DEBUG_ONLY_THIS_PROCESS を付け
てるんでしょうね、たぶん。ということになりますね。
VS 2013 のオプションを見た限りでは、子プロセスも自動的にデバッグ対象とするような
設定は見当たりませんでした。
2008 や 2010 は手元に環境がないため、ちょっとわかりません。

仲澤@失業者 2014/12/11(木) 13:46:18
難しそうですね。
C/C++ネイティブコードなら、
対象exeのデバッグを開始したい位置に

__asm int    3

としておく方法も、覚えておくと役にたつかもしれません。

tetrapod 2014/12/11(木) 15:33:33
x86 では __asm が有効なんだけど
x64 では __asm はできなくなっちったから __debugbreak() を推奨する。

DebugBreak(); だと API Call
__debugbreak(); だと Visual C++ 組み込みインライン展開関数になる。
x86/x64 native では INT 3
C++/CLI なら BREAK (MSIL)
になってちょっとだけ楽できる様子。

仲澤@失業者 2014/12/12(金) 13:59:01
おおっ、tetrapodさんフォローありがとうございます。

亀山 2014/12/15(月) 11:43:14
aetosさん、仲澤@失業者さん、tetrapodさん、情報ありがとうございます。

Visual Studioに「子プロセスもデバッグ対象にする」のような設定があって、
そのときにVisual StudioがDEBUG_ONLY_THIS_PROCESSを付けないでくれさえすれば、
このようなデバッグ方法が可能だったのにということですね。

もしくは、「デバッグ開始時にコマンドラインを選択する」が欲しかったところです。

古いスレッドには追加発言できません。