VSCODEでVisual C++ ToolKit 2003によるC言語のプロジェクトをデバッグしたい!今更!
本当に今更、というかVisual C++ ToolKit 2003は既に公開停止されてるし、誰向けの話なんだって感じですが。多分、Visual Studio 2005でも使えると思います。多分。
昔、秀丸とかでbatchファイルとメイクファイルを使ってC言語のプログラムをコンパイルやらリンクやらをやってた思い出をふりかえりたく、VSCODEでデバックできる環境を作ってみた。
あの頃は、Sublime TextとかJmEditとかAtomとかいろいろなテキストエディタの間をふらふらしてた思い出。
概要
VSCODEでVisual C++ ToolKit 2003によるC言語のプロジェクトをデバックする設定を掲載します。
注意
Visual C++ ToolKit 2003は、既にサポートが切れててセキュリティ的にあまり良くないでご注意です。
手順書
launch.jsonの例
.vscode/launch.jsonの入力例を下記に示す。
{
"version": "0.2.0",
"configurations": [{
"name": "C++ Launch (Windows)",
"type": "cppvsdbg",
"request": "launch",
"preLaunchTask": "rebuild-debug",
"program": "${workspaceFolder}/bin/debug/program.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}/bin/debug",
"environment": [],
"console": "internalConsole",
"internalConsoleOptions": "openOnSessionStart"
}]
}
環境によって書き替える必要がある項目を挙げる。
preLaunchTaskはデバッグ開始前に実行するtask.jsonに記述されたタスクを指定できる。上記の場合は、rebuild-debugというタスクを実行する例です。
programにはデバッグするプログラム(出力したexeファイルなど)を指定する。上記の場合は、ワークスペースフォルダの中にあるbin/debug/program.exeというプログラムをデバッグする例です。
cwdにはデバッグ開始時の作業ディレクトリを指定する。通常は、デバッグするプログラムがあるディレクトリを指定すれば良い。上記の場合は、ワークスペースフォルダの中にあるbin/debugというディレクトリを指定するです。
コンパイル・リンクのオプションの例
デバッグでブレイクポイントや変数をウォッチしたい場合、コンパイルやリンクをおこなう際にオプションで最適化を無効化やデバッグ情報の出力をできるようにする必要がある。
下記に設定の例を示す。
コンパイラ(cl.exe)
/Od /Z7 /D _DEBUG
/Odは、最適化を無効にするオプションである。
/Z7は、デバッグ情報をすべて含むようにするオプションである。
/D _DEBUGはプリプロセッサに_DEBUGを定義するオプションである。外部のライブラリなどが_DEBUGでデバッグの判定をしてる可能性があるので定義しておくのが吉。
リソース・コンパイラ(rc.exe)
/d _DEBUG
/d _DEBUGはをプリプロセッサに_DEBUGを定義するオプションである。多分、意味がないけど念のため。
リンカ(link.exe)
/DEBUG:FULL /OPT:NOICF /MAP
/DEBUG:FULLはデバッグ情報をすべて出力するオプションである。バイナリファイルの出力先に.pdbファイルが出力される。
/OPT:NOICFはリンカの最適化を無効にするオプションである。
/MAPはマップファイルの生成するオプションである。バイナリファイルの出力先に.mapファイルが出力される。
テスト
標準の設定だとVSCODEでF9でブレイクポイントの設定、F5でデバッグを開始できるのでテストしてみよう。
ブレイクポイントなどで一時停止するとローカル変数の状態の状態を確認することができる。
まとめ(感想文)
F5でデバッグ開始できるだけでも相当便利ですね。
デバッグ関係ないんですが、文字列の結合がオペランドでやれないのは現代では正直キツイっす。
引用・参考文献
コンパイラなどで使用できるオプションを確認したい場合はcl.exe -helpで直接本人?に聞いてみよう。
下記のサイトでは新しいバージョンのものしか載ってないんですが、こちらでも確認できる。ただし、対応していないオプションもそれなりにあるので注意。
