Windwos11: MinGW64 + VSCode でC言語デバッグ環境を構築する最小手順

# 背景
子供が大学の実習のためのC言語開発環境の構築に苦労していました。Windows11 の PC で、 MinGW とVSCode を使うことが推奨されているようなのですが、うまく構築できず、チューターの大学院生に聞いても解決しなかったとのことです。私もネット検索しながら手伝ったのですが、ぴったりの情報が意外と見つからず苦労したので、覚書として書いておくことにしました。

# ポイント
古い環境の MinGW ではなくて新しい MinGW64 を使います。MinGW64  のインストールはアーカイブを展開して適切なフォルダーに置いて、パスを設定すればOKです。コンパイルに必要な gcc などとデバッグに必要な gdb は MinGW64 のアーカイブに含まれています。
ネット検索で出てくる情報では、VSCodeで "launch.json" を作成すると書かれているものが多いですが、これは必須ではありません。 "tasks.json" を作成すると書かれている情報もありますが、これはVSCodeでプロジェクトフォルダーを開くと自動で生成されます。また、プロジェクトフォルダーを開かず "tasks.json" が無い状態でも一応デバッグ可能です。
今回うまく構築できていなかった環境は古い MinGW を(不完全に)インストールしていて、コンパイルと実行はできるがデバッグはできないという状況でした。"launch.json" や "tasks.json" をいくら作ってもデバッグできないわけです。

# 手順
## 拡張子を表示
Windows11の初期状態では、エクスプローラーでファイルの拡張子が隠蔽されているので、表示->表示->ファイル名拡張子 を選択して表示されるようにします。
(これは皆さんやっていますよね)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/6cb2681a-93de-a360-cba1-1c43d0b4a8ef.png)

## MinGW64をインストール
### ダウンロード
https://github.com/niXman/mingw-builds-binaries/releases からアーカイブをダウンロードします。多数のファイルがありますが、ファイル名に "win32-seh-msvcrt" または "win32-seh-ucrt" が入ったものをダウンロードしましょう。今回、下表の2つのファイルについて動作を確認してみたのですが、デバッグ時の動作に一部違いがありました。

|ファイル名|デバッグ動作|
|---|---|
|x86_64-14.2.0-release-win32-seh-msvcrt-rt_v12-rev0.7z|stdio.hまでステップインできる|
|x86_64-14.2.0-release-win32-seh-ucrt-rt_v12-rev0.7z|stdio.hにステップインできない|

### 展開と移動
ダウンロードできたら、エクスプローラーの右クリックメニューで「すべて展開」を選んで展開します。
そこで展開された "mingw64" というフォルダーを丸ごと移動(またはコピー)するのですが、Cドライブ直下に "tools" という名前のフォルダーを作って、その配下に移動するのがお勧めです。今後、各種のツールをインストールする場合も、"tools" 配下のフォルダーに入れるようにすると、Cドライブ直下がすっきりします。名前は "tools"でなくてもかまいませんが、空白文字や日本語文字を含まない名前にしておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/e6be9a7b-5dd0-5b92-b8ed-44f17def2c1a.png)

### 環境変数の設定
エクスプローラーで "MinGW64" 配下の "bin" フォルダーを開いた状態でツールバーをクリックすると、このフォルダーのフルパスが出てくるので、Ctrl+C または右クリックメニューの「コピー」でコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/13f4faa4-0779-9505-b8cb-190a212e1a21.png)

スタートメニューで "en" または "env" とタイプして「環境変数を編集」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/476be39d-6014-e9b4-f28e-8ec985995e7d.png)

ここで "envi" までタイプしてしまうとなぜか「システム環境変数の編集」が出てきてしまうのですが、これを選んでしまうと、次の画面で「環境変数」ボタンを押さなくてはならず、もうひと手間かかってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/097b38ec-0e96-701a-0262-cbc5e856c58f.png)

「環境変数の編集画面で、ユーザー環境変数の "Path" を選択して「編集」ボタンを押し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/bb2bfb52-7398-f5e3-23d2-501c09ae7cf6.png)

「新規」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/9260da70-a32d-b212-10ec-8f4541b67175.png)

そこで Ctrl+V を押すと、先ほどエクスプローラーのアドレスバーでコピーしたパスが貼り付けられます。さらに下の「OK」ボタンを押してこの画面を閉じて、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/5ca36866-7273-7345-e264-506a4ebc66fb.png)

さらに、前の「環境変数」画面の「OK」ボタンを押して、環境変数の設定を完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/6c78d0d0-5063-cbc9-d3b3-ea50424e4230.png)


このようにPathを適切に設定しておけば、VSCode側でMinGW64のツールを見つけてくれます。

## VSCode をインストール
https://code.visualstudio.com/download から Windowsの x64用のインストーラーをダウンロードしてインストールします。インストール先はデフォルト設定でいいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/cc686bf8-2a00-c677-89d0-fa8df06bccaa.png)

「追加タスクの選択」で
- エクスプローラーのファイルコンテキストメニューに[Codeで開く]アクションを追加する
- エクスプローラーのディレクトリコンテキストメニューに[Codeで開く]アクションを追加する

を追加しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/cf708125-1a41-66b6-42b1-2b99a038c51c.png)

## 使い方
### プロジェクトフォルダーを用意
プロジェクトフォルダーを用意します。すでにソースコードがある場合はここに置きます。
このプロジェクトフォルダーに対して、エクスプローラーのメニューから「Codeで開く」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/dd51843f-f5b9-0f7e-710a-a3b84e013112.png)

現在のウィンドウ内のファイルの作成者を信頼するか聞いてくるので、Yesを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/88867e4a-33c5-ea3e-b027-eaeb61da7f50.png)

ソースコードをこれから作る場合は EXPLORER ペインの右クリックメニューで "New File..."を選び、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/6504e14f-105a-ae33-5539-a0529509e33a.png)

ソースコードのファイル名をつけます。
プロジェクトフォルダーにすでにソースコードがある場合は、EXPLORER ペインに表示されているファイル名をクリックして開きます。

VSCodeがまっさらの状態だと、 "C/C++ Extension Pack" をインストールするか聞いてくるので "Install"を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/d8eb22cc-d40d-e45e-2072-45dd26c364d9.png)

しばらく待つとインストールが完了します。
このタブは閉じてしまってOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/575a10de-559d-05f6-0ce8-d3e55964f699.png)

先ほど新規作成したソースコードのタブに、例えば次のようなソースコードを書いてみます。
``` test01.c
#include <stdio.h>

void main(void){
    for(int i=0; i < 8; i++){
        printf("%d\n", i);
    }
}
```

左側の、右向き三角と虫のアイコンをクリックして、"Run and Debug" ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/b3eaaa08-b33d-ad84-5a3d-1c3167d62988.png)

"C++ (GDB/LLDB)" を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/090091f9-b2e9-91a3-2c18-d61b8ea86581.png)

"Run and Debug" ボタンを再び押します。
"C/C++:gcc.exe build and debug active file" を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/72d2c2fd-5a9b-e04a-35b7-d9e27b7e3010.png)

CMake に関するダイアログが右下に出ますが、とりあえず無視しておいてOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/92cf8c92-3a99-adff-423e-6b142bb9fa6f.png)

デバッガーが動作し、 DEBUG CONSOLE が流れていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/3f7c0887-1f3a-0713-2c51-98419fc26cee.png)

ソースコードの行番号の左側にマウスカーソルを合わせると "Click to add a breakpoint" と出るので、そのままクリックするとブレークポイントを設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/4b034cf3-3410-f7df-d350-d2d69d2b6e1a.png)

ブレークポイントを1つ以上設定して "Run and Debug" を押すと、最初に到達したブレークポイントで停止します。
"VARIABLES" で現在の変数の値を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/27616701-f354-1275-0438-1c5828a24c31.png)

デバッグツールバーの各ボタンを押すことで、続行、ステップオーバー、ステップイン、ステップアウト、リスタート、ストップの各操作をすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/a72addbf-4b68-8696-c2ad-f8d53a72dd7d.png)

ここまでの操作で、プロジェクトフォルダーの配下に ".vscode" というフォルダーが生成されて、その配下に "tasks.json" というファイルが生成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/d2023fcc-9438-8430-5f3f-4de5b8a7d2a8.png)

ここに必要な設定が記録されているので、次回以降はプロジェクトフォルダーを「Codeで開く」すれば、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/554c7d7e-f15c-8167-6b49-0c19ef456577.png)

"Run and Debug" ですぐにデバッグできます。
なお、標準出力・入力は TERMINAL タブで出力・入力されますので、他のタブに切り替わっている場合は再度切り替えて確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/366c78d2-16ae-9258-78f5-8db81872a173.png)

ところで、VSCodeでプロジェクトフォルダーを開かず ".vscode" フォルダーが作られなかった場合、 "tasks.json" ファイルも作られませんが、デバッグは可能です。ただし、"tasks.json" ファイルの情報がないため、"C++ (GDB/LLDB)" を選ぶ操作と "C/C++:gcc.exe build and debug active file" を選ぶ操作が毎回必要になります。



# 注意事項
## MinGW Installer は使わない
sourceforge や softnic から MinGW Installer (mingw-get-setup.exe) がダウンロードできますが、古い環境であること、デフォルト選択肢が設定されていないことから、正しくインストールすることが困難です。これは使わないで、MinGW64を使うようにしましょう。
![MinGW_Installer_非推奨.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/c8a3a7e2-e1b4-6331-c558-103591250102.png)

## Code Runner は不要
VSCode上でCなどのプログラムを実行するためのプラグインで "Code Runner" というのがありますが、上記の "Run and Debug" で実行できるので不要でしょう。"Code Runner" ではデバッグができないので、少し複雑なプログラムを書いて意図通り動かないとバグ探しに苦労することになります。早めにデバッグに慣れておいたほうがいいでしょう。