none
EXEからEXEを呼び出した時に呼び出されたEXEをステップ実行する方法。 RRS feed

  • 質問

  • こんにちわ。VB初心者です。

     

    AというwindowsアプリケーションからBというwindowsアプリケーション呼び出すプログラムを作成しています。

    テストの方法として両者続けてのブレークポイントを置いてデバック実行をしたいのですが、

    A側はブレークポイントを置いてデバック実行できるのですが、

    呼び出されたB側のブレークポイントは透明になりブレークポイントはスルーされてしまい困っています。

     

    環境は一つのソリューションにAとBのprojectを設定しAのprojectをスタートアッププロジェクトにしています。

    両者共にスタートアップはフォームです。

    ソースでは以下の方法でEXEを実行しています。(実行の方法はこれでなくてもいいのですが・・・・)

     

     Dim myProcess As New Process()
            Dim myProcessStartInfo As New ProcessStartInfo("D:\B.exe")
            myProcessStartInfo.UseShellExecute = False
            myProcessStartInfo.RedirectStandardOutput = True
            myProcess.StartInfo = myProcessStartInfo
            myProcess.Start()

     

     

    Use by

     .NET Framework 2.0

      Visual Basic 2005

    2008年5月15日 3:15

回答

  • Bのプロセスがスタートしたら、「デバッグ」メニューの「プロセスにアタッチ」でBのプロセスを選択(表示されてないなら「更新」)して、「アタッチ」で、Bのブレークポイントでも止まるようになりますよ。

    2008年5月15日 3:53
  •  

    IIJIMASさんありがとうございました。

    B側のブレークポイントを置いてデバック実行が出来ることを確認いたしました。

     

    しかし私の理解不足なせいなのですが、

    例えば上記の場合、B側のプロセスが生成されてからでないと

    プロセスのアタッチができませんでした。

    具体的な話では

    まずA側のmyProcess.Start()にブレークポイントを置きます。

    その時点でデバックメニュー→ウインドウ→プロセスでプロセスウインドウ表示

    右クリック「プロセスにアタッチ」で表示されるプロセスにB側のEXEはまだ存在しません。

    そのため、一つステップ実行します。

    その時初めてB側のEXEが選択でき、アタッチすることが出来るのですが

    この時点でB側のフォームが表示されてしまっているので

    例えばFormLoadにブレークポイントを置いた場合

    FormLoadのデバック実行ができないのです。

    話を他の場合に置き換えると

    例えばB側のスタートメニューがフォームではなくSub Mainだった場合は

    あっという間に処理が流れてしまい残念な結果になってしまいます。

     

    上記のようなことを解決する方法はないでしょうか(><)?
    2008年5月15日 4:43
  • #他にもっと良い方法があるかもしれません。

     

    B側のコードが変更できるのであればデバッグ用のバージョンを用意しておくと楽じゃないでしょうか。

    デバッグ中はB側をSub Mainの先頭にSystem.Diagnostics.Debugger.Break() や、MessageBox.Showなどを入れたバージョンを使って、開始時に処理をとめておくとアタッチできると思います。

    2008年5月15日 13:02
  • デバッガは1プロセスごとに割り当てるものなので、Visual Studioから直接起動したもの以外のプロセスに、自動的にデバッガを仕込むのは無理じゃないかなと思います。

    どうしてもやりたいのであれば、C.Johnさんも言われているようにアタッチする時間を開発者に与えるコードを書くことになります。

    Debugger.Breakであったり、Thread.Sleepであったり、MessageBox.Show等ですね。

     

     

    BをデバッグするためにAが必須ではない、つまり引数さえ渡されればAに依存しないのであれば、B単体をデバッグ・テストするべきだと思います。

    Bをスタートアッププロジェクトに設定し、Bのプロジェクトのプロパティのデバッグタブで起動時の引数とかを調整し、それでデバッグしておくという手法です。
    2008年5月15日 14:02
    モデレータ

すべての返信

  • Bのプロセスがスタートしたら、「デバッグ」メニューの「プロセスにアタッチ」でBのプロセスを選択(表示されてないなら「更新」)して、「アタッチ」で、Bのブレークポイントでも止まるようになりますよ。

    2008年5月15日 3:53
  •  

    IIJIMASさんありがとうございました。

    B側のブレークポイントを置いてデバック実行が出来ることを確認いたしました。

     

    しかし私の理解不足なせいなのですが、

    例えば上記の場合、B側のプロセスが生成されてからでないと

    プロセスのアタッチができませんでした。

    具体的な話では

    まずA側のmyProcess.Start()にブレークポイントを置きます。

    その時点でデバックメニュー→ウインドウ→プロセスでプロセスウインドウ表示

    右クリック「プロセスにアタッチ」で表示されるプロセスにB側のEXEはまだ存在しません。

    そのため、一つステップ実行します。

    その時初めてB側のEXEが選択でき、アタッチすることが出来るのですが

    この時点でB側のフォームが表示されてしまっているので

    例えばFormLoadにブレークポイントを置いた場合

    FormLoadのデバック実行ができないのです。

    話を他の場合に置き換えると

    例えばB側のスタートメニューがフォームではなくSub Mainだった場合は

    あっという間に処理が流れてしまい残念な結果になってしまいます。

     

    上記のようなことを解決する方法はないでしょうか(><)?
    2008年5月15日 4:43
  • #他にもっと良い方法があるかもしれません。

     

    B側のコードが変更できるのであればデバッグ用のバージョンを用意しておくと楽じゃないでしょうか。

    デバッグ中はB側をSub Mainの先頭にSystem.Diagnostics.Debugger.Break() や、MessageBox.Showなどを入れたバージョンを使って、開始時に処理をとめておくとアタッチできると思います。

    2008年5月15日 13:02
  • デバッガは1プロセスごとに割り当てるものなので、Visual Studioから直接起動したもの以外のプロセスに、自動的にデバッガを仕込むのは無理じゃないかなと思います。

    どうしてもやりたいのであれば、C.Johnさんも言われているようにアタッチする時間を開発者に与えるコードを書くことになります。

    Debugger.Breakであったり、Thread.Sleepであったり、MessageBox.Show等ですね。

     

     

    BをデバッグするためにAが必須ではない、つまり引数さえ渡されればAに依存しないのであれば、B単体をデバッグ・テストするべきだと思います。

    Bをスタートアッププロジェクトに設定し、Bのプロジェクトのプロパティのデバッグタブで起動時の引数とかを調整し、それでデバッグしておくという手法です。
    2008年5月15日 14:02
    モデレータ