BashOnWindowsでのVisualStudioCodeのデバッグ (C++, gdb)

bash on windowsのC++とgdbのlaunch.jsonの書き方を探してもいい記事が見つからなかったので、メモみたいな感じで書いてます。

#Windows側の環境
windows10
VisualStudioCode(x64) v.1.20.1


#bash on windows側の環境
Ubuntu 16.04.3 LTS (Xenial Xerus)
g++ 5.4.0
gdb 7.11.1


#デバッグしたいファイルを用意する
とりあえずファイルとして`Desktop/cpp_test/test.cpp`を用意しました。

```cpp:test.cpp
#include <iostream>

int main(){
    int hoge = 34;

    std::cout << hoge << "\n";

    return 0;
}

```

![000.PNG](https://qiita-image-store.s3.amazonaws.com/0/229908/bc396d2a-835c-bac4-ac7b-6f3b41c291aa.png)

このファイルをデバッグしていきます。


#launch.jsonの作成
デバッグしたいファイルを用意したら

「デバッグ」→「構成の追加」

からlaunch.jsonを作成します。

![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/229908/d363e3e7-3d21-9aa3-8290-d83e6f452c5d.png)

C++のgdb、windowsのどちらかを選んであげましょう。
以下のようなlaunch.jsonが生成されるはずです。

![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/229908/eda52c6a-835a-50b0-b05e-d1d0cc7f386c.png)

#launch.jsonの編集
右下の「構成の追加...」を押して、

![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/229908/27fec939-5838-eeba-9b2f-61b02f030971.png)

「C/C++: (gdb) Bash on Windows Launch」

を選んであげましょう。

もともとあったコードを消すと、以下のようなコードになると思います。

```javascript:launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Bash on Windows Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "enter program name, for example ${workspaceFolder}/a.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "pipeTransport": {
                "debuggerPath": "/usr/bin/gdb",
                "pipeProgram": "C:\\Windows\\sysnative\\bash.exe",
                "pipeArgs": [],
                "pipeCwd": ""
            },
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}
```

しかし、このままでは動きません。少し編集してあげましょう。
変更する箇所は以下の通りです。

| キー | 説明 | (例) |
|:-----|:-----|:-----|
|name|構成のところに表示される名前|"debug for a.out"|
|program|bash上での実行ファイルの位置|"/mnt/c/~~~/cpp_test/a.out"|
|args|実行時に渡す引数（必ず""で囲うこと）|["2", "4", "abc"]|
|stopAtEntry|エントリーポイントで止まるかどうか|false|
|cwd|bash上での実行位置|"/"|
|pipeTransport:debuggerPath|bash上でのgdbの位置|"/usr/bin/gdb"|
|pipeTransport:pipeProgram|Windowsでのbashの位置|"C:\\Windows\\sysnative\\bash.exe"|
|pipeTransport:pipeArgs|pipe時につけるオプション|["-c"]|
|pipeTransport:pipeCwd|bashの実行位置？|"/"|
|sourceFileMap|windowsとbashの連携時に必要？|{"/mnt/c": "C:\\\\"}|

sourceFileMapは元々のファイルにないので新しく追加する必要があります。

最終的なファイルは以下のようになりました。

```javascript:launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Bash on Windows Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "/mnt/c/Users/~~~/Desktop/cpp_test/a.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "/",
            "environment": [],
            "externalConsole": true,
            "pipeTransport": {
                "debuggerPath": "/usr/bin/gdb",
                "pipeProgram": "C:\\Windows\\sysnative\\bash.exe",
                "pipeArgs": ["-c"],
                "pipeCwd": "/"
            },
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "sourceFileMap": {
                "/mnt/c": "C:\\"
            }
        }
    ]
}
```

#ブレイクポイント
launch.jsonが書けたら、デバッグしたい箇所にブレイクポイントを設定しておきましょう。

![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/229908/7e6f7002-6222-8287-66e7-dfdcb8ca6a9b.png)

今回は6行目につけてみました。

#コンパイル
「表示」→「統合ターミナル」でターミナルを表示し、

```
bash
```

でBash On Windowsに入り、

```
g++ -g test.cpp
```

と打ち、デバッグ用にコンパイルします。

#デバッグ実行
F5を押してデバッグを実行してみましょう。

![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/229908/1b763ee2-b725-2354-d5be-191b305bcf89.png)

ちゃんと6行目で止まり、hogeの値が表示されていますね。


#最後に
gdbでデバッグをしようとしたらlaunch.jsonのデバッグをしていた...

なんてことが起こってしまう、いまいち書き方のわからないlaunch.json。

詳しい説明があればいいんですけどね...