VSCodeでC言語(gcc)のデバッグをできるようにする方法

VSCodeC言語(gcc)のデバッグをできるようにする方法

環境
Windows10
VSCode
MinGW(gcc)

デバッグ環境を作る手順は以下の通り

  1. cファイルの作成
  2. c_cpp_properties.jsonの作成
  3. tasks.jsonの作成
  4. launch.jsonの作成
  5. launch.jsonの編集
  6. 実行ファイルの作成
  7. デバッグを実行
  8. 実行状態(結果)の表示
  9. デバッグでバグがありcファイルを編集したとき

1. cファイルの作成

まずフォルダとcファイルを作成します
ここではhelloフォルダとhello.cです
hello.c
※cファイルはShift-Jisで保存してください(UTF-8で保存した場合はtasks.jsonを編集する必要があります)
これは3. tasks.jsonの作成で後述します
hello.c

#include <stdio.h>
int main()
{
  int i;
  for(i=0;i<10;i++)
    printf("ハロー!\n");
  return 0;
}

f:id:Jikoryuu:20200531144006p:plain

2. c_cpp_properties.jsonの作成

c_cpp_properties.jsonファイルを作成するには以下の手順を行います
Ctrl+Shift+Pを押します
コマンドパレットが開くので「c/c++:e」と入力すると以下リストが現れます
f:id:Jikoryuu:20200531144103p:plain
C/C++:構成の編集(UI)」を選択します
f:id:Jikoryuu:20200531144147p:plain
C/C++ Configurasions」のUI(ユーザーインターフェース)が開きます
f:id:Jikoryuu:20200531144225p:plain
コンパイラ パス」の▼を押してリストを表示する
f:id:Jikoryuu:20200531144329p:plain
「C:/MinGW/bin/gcc.exe」を選択します
f:id:Jikoryuu:20200531144418p:plain
「IntelliSenseモード」がエラーになるので▼を押してリストを表示します
f:id:Jikoryuu:20200531144507p:plain
リストから「gcc-x64」(gcc-x86でも可)を選択します
f:id:Jikoryuu:20200531144550p:plain
f:id:Jikoryuu:20200531144617p:plain
暫くすると「c_cpp_properties.json」ファイルが自動的に作成されます
f:id:Jikoryuu:20200531144649p:plain
エクスプローラーの「c_cpp_properties.json」ファイルを確認します
f:id:Jikoryuu:20200531144742p:plain

3. tasks.jsonの作成

再びCtrl+Shift+Pを押します
コマンドパレットが開くので「tasks:c」と入力すると以下リストが現れます
「タスク:タスクの構成」を選択します
f:id:Jikoryuu:20200531144817p:plain
続けて「テンプレートからtasks.jsonを生成」を選択
f:id:Jikoryuu:20200531144844p:plain
「Others 任意の外部コマンドを実行する例」を選択
f:id:Jikoryuu:20200531144927p:plain
再びコマンドパレットに「tasks:c」と入力すると絞り込まれた候補がリストに現れるのでその中から「タスク:タスクの構成」を選択します
f:id:Jikoryuu:20200531145012p:plain
「構成するタスクを選択」のリストから「shell gcc.exe build active file」を選択
f:id:Jikoryuu:20200531145047p:plain
下の画像のような「tasks.json」が作成されます
f:id:Jikoryuu:20200531145122p:plain
もし違う内容のものが作成されたら「tasks.json」を削除して作成し直してください

※cファイルをUTF-8で保存している場合は「tasks.json」を編集する必要があります
具体的にはtasks項目のargsパラメーターに「-fexec-charset=CP932」を追加します

			"args": [
				"-g",
				"${file}",
				"-o",
				"${fileDirname}\\${fileBasenameNoExtension}.exe"
			],

			"args": [
				"-g",
				"${file}",
				"-o",
				"${fileDirname}\\${fileBasenameNoExtension}.exe",
				"-fexec-charset=CP932"
			],

4. launch.jsonの作成

launch.jsonファイルを作成するには以下の手順を行います
Ctrl+Shift+Dを押します
左の実行ボタンがアクティブになり下の画像のようになります
赤丸の「launch.json ファイルを作成します」をクリックします
f:id:Jikoryuu:20200531145151p:plain
「環境の選択」のリストが現れるので「C++ (GDB/LLDB)」を選択します
f:id:Jikoryuu:20200531145219p:plain
下の画像の「launch.json」が作成されます
f:id:Jikoryuu:20200531145321p:plain

5. launch.jsonの編集

launch.jsonを編集するためにlaunch.jsonを選択します
f:id:Jikoryuu:20200531145344p:plain
画像の赤丸の所を編集します
f:id:Jikoryuu:20200531145409p:plain
下記のパラメーターを変更します

"program": "プログラム名を入力してください (例: ${workspaceFolder}/a.exe)",
↓
"program": "${workspaceFolder}/hello.exe",

"miDebuggerPath": "/path/to/gdb",
↓
"miDebuggerPath": "C:\\MinGW\\bin\\gdb.exe",

6. 実行ファイルの作成

hello.cファイルをアクティブ(選択・表示)します
Ctrl+Shift+Bを押します
コマンドパレットに「実行するビルド タスクを選択」にリストが現れるので「Shell:gcc.exe build active file」を選択します
f:id:Jikoryuu:20200531145436p:plain
hello.exeが作成されました
f:id:Jikoryuu:20200531145454p:plain

7. デバッグを開始する

hello.cファイルをアクティブ(選択・表示)にして任意の場所にブレークポイントを置いてください
コードペインの行番号の左をクリックするかデバッグしたい行にカーソルを置いて「F9」キーを押すとブレークポイントができます
ブレークポイントが置かれるとコードペインの行番号の左に赤い●が現れます
ブレークポイントは幾つでも置けます

メニューの「実行」→「デバッグの開始」または「F5」キーを押します
するとデバッグが開始されます
f:id:Jikoryuu:20200531145520p:plain
黄色いラインがブレークポイントで止まったらデバッグ環境の構築は成功です
f:id:Jikoryuu:20200531145618p:plain

8. 実行状態(結果)の表示

launch.jsonを編集するためにlaunch.jsonを選択します
(argsに日本語を使用しそれを表示した場合にexternalConsoleを使用すると文字化けするので注意[解決方法:stdlib.hをインクルードしsystem("chcp 65001");をprintfより前に追加することで文字化けが解消する])

下記のパラメーターを変更します

"externalConsole": false,
↓
"externalConsole": true,

f:id:Jikoryuu:20200531145648p:plain
f:id:Jikoryuu:20200531145715p:plain
ターミナル(端末)が別窓で開き実行状態(結果)が表示されます
入力がある時にはここで入力できます
f:id:Jikoryuu:20200531145737p:plain
特にエラーが無ければデバッグ環境の構築成功です
f:id:Jikoryuu:20200531145757p:plain

9. デバッグでバグがありcファイルを編集したとき

6.の実行ファイルの作成「Ctrl+Shift+B」をしてからデバッグ「F5」をして下さい

デバッグができるまでの手順は以上です
お疲れさまでした

c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.18362.0",
            "compilerPath": "C:/MinGW/bin/gcc.exe",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

tasks.json

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "shell",
			"label": "shell: gcc.exe build active file",
			"command": "C:/MinGW/bin/gcc.exe",
			"args": [
				"-g",
				"${file}",
				"-o",
				"${fileDirname}\\${fileBasenameNoExtension}.exe"
			],
			"options": {
				"cwd": "C:/MinGW/bin"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": "build"
		}
	]
}

launch.json

{
  // IntelliSense を使用して利用可能な属性を学べます。
  // 既存の属性の説明をホバーして表示します。
  // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "(gdb) 起動",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/hello.exe",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": true,
      "MIMode": "gdb",
      "miDebuggerPath": "C:\\MinGW\\bin\\gdb.exe",
      "setupCommands": [
        {
          "description": "gdb の再フォーマットを有効にする",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ]
    }
  ]
}