Category Archives: Visual Studio

Visual Studio 2022で子プロセスのデバッグ

VS2022になってIDEが64bit化され、大きなプロジェクトでも不正終了しなくなった。そこで子プロセスのデバッグもやりやすくなったと思うのでその紹介。

拡張をインストール

Microsoft Child Process Debugging Powertoolをインストール

有効にする

プロジェクトを開いて子プロセスのデバッグを有効にする。

ブレークポイント設定

プログラムの最初の方にブレークポイントをセットすれば、デバッグ対象プロセスから新規生成されたプロセスでブレークポイントがヒットする。もちろん同じ実行ファイルの場合。

プロジェクトが違う場合

違うプロジェクトの実行ファイルを起動する場合は、起動元のプロジェクトが.NETならまず初めにプロジェクトの設定のデバッグ欄でで、「ネイティブコードデバッグを有効にする」をチェックする。

次に拡張機能の設定で2番目のプロジェクトタイプを設定する。

Win32APIが呼ばれたときブレークポイントを設定する

CreateProcessでブレークポイント

CreateProcessでブレークポイントを設定するには、新規ブレークポイントで以下のように入力する。

kernel32.dllはこの関数を実装しているDLL40、はこの関数の引数のバイト数だと思われる。

CreateProcessにブレークポイント

このやり方でうまくいかない場合

プログラムの最初の方で適当なブレークポイントを設定し、以下のコードの結果を調べる。

このアドレス値でブレークポイントを設定する。
アドレスでブレークポイント

アドレスでブレークポイント設定"

ShellExecuteExなどはCreateProcessを他のスレッドで呼ぶらしい。その場合はデバッグの場所でメインスレッドを指定する。
メインスレッドを選択

スタックトレースがうまく表示されないときはシンボルのロードをする。

追記:Visual Studio 2017以降で動かない場合

関数ブレークポイントの設定で以下のように入力する(アンダーバーと@以下を削除する)。

VS2019のC++でstdのソースコードでバッグをする

/JMCを削除

デバッグモードでのデフォルトのコンパイルフラグに/JMCが追加されていて、これが有効になっているとstdのソースコードにステップ・インできない。よってこれを無効にする(以下の画像を参照)
/JMCを無効にする
デバッグオプションのJust My Codeはモジュールごとに区分けしていると思うので、どうでもいいはず。

Win32APIのコールバック

コールバック関数(これは自分で定義したもの)のデバッグを効率良く行うには/JMCを有効にしたほうが良い。このフラグを有効にすると、コールバックを引数にするAPIを呼んだときに、そのコールバックにステップ・インしてくれる。