みねっちょのマイコン関係ブログ

組込開発系フリーソフトやハードの情報発信ブログ

WSL の VSCode で 複数 C/C++ の make と GUI デバッグをする

サイト内 Google 検索:


最終更新: 2021-05-20
VSCode には、WSL と連携した GDB (The GNU Project Debugger) デバッガの GUI フロントエンド機能が備わって居ます。また、自作した MakefileVSCode 内からの実行も可能です。本記事では、マイクロソフト製の C/C++ 言語用のデバッグ拡張機能、および同 Makefile 拡張機能のインストールと、複数ファイルのビルドから GUI でのシングルステップ実行によるソースコードデバッグまでの手順を紹介します。

目次:



C/C++ 用の IntelliSense をインストールする:

VSCode と WSL 内の GDB (The GNU Project Debugger) との連携には、Microsoft 製の IntelliSense 付きの デバッガをインストールして使用します。IntelliSense 自体はソースコードの自動補完 (オートコンプリ―ト) 機能ですが、デバッガと組み合わせると変数の中身の値も表示可能になります。次の手順でイントールします。

  1. VSCode を立ち上げます。Windows 側からの実行でも、WSL 内で code コマンドからの実行でも、どちらでも構いません。
  2. 「ようこそ」画面右列の「設定とキーバインド」をマウスでクリックするか、キーボードの Ctrl+Shift+x キーを押して、左列に拡張機能サーチボックスを表示します。
  3. Ctrl+aBS の順にキーを押しボックス内の文字を消去します。
  4. ボックス内に C/C++ と入力し、Microsoft 製の C/C++ IntelliSense, debugging, and code browsing. をインストールします。


MS製の Makefile Tools をインストールする:

VSCode 内からの WSL 上 Makefile の実行にも、Microsft 製の IntelliSense 連携ツールを使用します。

  1. 「ようこそ」画面右列の「設定とキーバインド」をマウスでクリックするか、キーボードの Ctrl+Shift+x キーを押して、左列に拡張機能サーチボックスを表示します。
  2. Ctrl+aBS の順にキーを押しボックス内の文字を消去します。
  3. ボックス内に Makefile Tools と入力し、Microsoft 製の Makefile Tools - Provide makefile support in VS Code: C/C++ IntelliSence, build, debug/run. をインストールします。
  4. 一旦、VSCode を閉じてください。


実験用サンプルソースコード:

Make によるビルドから GUI 上でのシングルステップ実行によるデバッグの実施例として、次のプログラムを使用します。Make の例題として、敢えて数行の複数ファイルにプログラムを分割しています。WSL の Linux 上に適当にディレクトリを作り、その下にファイルを置いてください。

cat から ALLEOF までを Linux のターミナル上にコピー&ペーストすると、Makefile.tmparith.hiadd.cisub.cmain.c の5つのファイルが出来ます。
cat << "EOF" > main.c
#include <stdint.h>
#include "arith.h"

int32_t main() {
  volatile int32_t  a, b;
  int32_t  c;

  a = 4;
  b = 3;
  c = iadd(a, b);
  if (c != 7) return 1;
  c = isub(a, b);
  if (c != 1) return 1;
  return 0;
}
EOF

cat << "EOF" > iadd.c
#include <stdint.h>

int32_t iadd(int32_t a, int32_t b) {
    int32_t c;
    c = a + b;
    return c;
}
EOF

cat << "EOF" > isub.c
#include <stdint.h>

int32_t isub(int32_t a, int32_t b) {
  int32_t c;
  c = a - b;
  return c;
}
EOF

cat << "EOF" > arith.h
#include <stdint.h>
int32_t iadd(int32_t a, int32_t b);
int32_t isub(int32_t a, int32_t b);
EOF

cat << "ALLEOF" > Makefile.tmp
PROGRAM = main.out
DISASM = main.disa
INCS = arith.h
SRCS = main.c iadd.c isub.c
OBJS = main.o iadd.o isub.o

CFLAGS = -g -gdwarf-2 -Og


.PHONY: all
all: depend $(PROGRAM) $(DISASM)

#.c.o:
#       $(CC) $(CFLAGS) $(CPPFLAGS) $(PROGRAM_ARCH) -c -o $@ $<

$(PROGRAM): $(OBJS)
        $(CC) $(LDFLAGS) $(PROGRAM_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@

$(DISASM): $(PROGRAM)
        objdump --disassemble-all --source --section=.text $< > $@

.PHONY: clean
clean:
        $(RM) *.o $(PROGRAM) $(DISASM)

.PHONY: depend
depend: $(INCS) $(SRCS)
ALLEOF



Makefile の動作の確認:

Makefile は、タブキーが区切り記号となります。スペース8個をタブキーに置き換える為に、unexpand コマンドを使用します。ファイルを展開した WSL のディレクトリで次のコマンドを実行して、ファイルの修正およびビルドの動作確認を行います。

unexpand Makefile.tmp > Makefile
make

次のメッセージが出れば、正しく動作しています。

gcc -g -gdwarf-2 -Og  -c -o main.o main.c
gcc -g -gdwarf-2 -Og  -c -o iadd.o iadd.c
gcc -g -gdwarf-2 -Og  -c -o isub.o isub.c
gcc  main.o iadd.o isub.o  -lg -o main.out

一旦ビルドしたバイナリファイルを、消去します。また、不要となった Makefile.tmp を消去します。

make clean
rm Makefile.tmp


VSCode 内での make の実行:

以下の手順に従って、VSCode の内部で make の設定します。この設定は1回だけ実施すれば当該ディレクトリ内 ( .vscode ディレクトリ内のログファイル) に記憶され、次回からは自動で実行されます。

  1. WSL を使用するターミナルを立ち上げ、上記ファイルを展開したディレクトリに移動します。
  2. ファイルを展開したディレクトリで VSCode を立ち上げます。code .
  3. VSCode 内の「エクスプローラー」で main.c をクリックして表示しておきます。
    f:id:minettyo:20210505155603j:plain:w150
  4. 通常は左に有るサイドバーでマウスを右クリックし、Makefile にチェックを入れます。
  5. ファイルマークの右下に歯車の付いた「Makefile」アイコンがサイドバーに出現します。
  6. 上述の「Makefile」アイコンをマウスで左クリックします。
  7. MAKEFILE ウィンドウで Build target: にマウスをホバーし、右の鉛筆マークをクリックします。
  8. 中央のウィンドウで all を選択すると make が始まります。
  9. 「出力」ウィンドウに結果が表示されますので、Configure succeeded. の文字を確認しておきます。


GUI でのシングルステップの実行:

以下の手順で、ソースコードを1行ずつシングルステップしてデバッグ可能です。

  1. MAKEFILEウィンドウのLaunch target: にマウスをホバーし、右の鉛筆マークをクリックします。
    f:id:minettyo:20210505154101j:plain:w150
  2. 中央のウィンドウで main.out を選択します。
  3. 先程開いた main.c ウィンドウ左の行番号の更に左にマウスをホバーします。
    f:id:minettyo:20210504212809j:plain:w150
  4. ブレークポイントを貼りたい行でマウスをクリックします。 今回の例では、8行目 a = 4とします。
  5. 念の為に、MAKEFILE ウィンドの上に有る「再生 のマーク」Run in terminal をマウスでクリックすると make が実行されます。
  6. MAKEFILE ウィンドの上に有る「虫のマーク」 Debug をマウスでクリック、もしくは F5 キーを押すとデバッグが始まります。
  7. 上部タブの「実行 (R)」をマウスでクリックすると、どのファンクションキーを押せばよいかが分かります。
    f:id:minettyo:20210505154140j:plain:w150
  8. F11 キー (ステップインする) を押すと、下位プログラムの中も含めてシングルステップ実行出来ます。ホームベース型の記号が次に実行する行をしめします。デバッガはホームベース記号が表示されている行の実行直前で停止しています。 F10 キー (ステップオーバーする) を押すと、下位プログラムの中には入らずシングルステップ実行出来ます。
  9. サイドバーの右向き三角に虫のマークの「実行とデバッグ」表示の中に「変数」ウィンドウがあります。ここに現在の変数の値が表示されます。デバッガは、ハイライトされている行の実行直前で停止している事に留意してください。尚、VSCode の新しいバージョンでは、ソースコードの変数の上にカーソルを置くだけでも変数の現在の値が表示さます。
  10. デバッグしているプログラムの最後を通り過ぎると、「出力」ウィンドウにエラーが表示されます。
    エラーメッセージ例: 'libc-start.c' を開くことができません。
  11. エラーメッセージは × 印をクリックして閉じて構いません。
  12. もう一度デバッグを実行したい場合には、上部タブの「実行 (R)」から「デバッグの再起動」をクリックするか、Ctrl+Shift+F5 を押します。
  13. デバッグを停止するには、上部タブの「実行 (R)」から「デバッグの停止」をクリックするか、Shift+F5 を押します。


【WSL 関係の目次へ戻る】