BeagleBoneBlackで学ぶYoctoLinuxの基礎 (4) ~VSCodeを使ったリモートデバッグ~

## あらまし

[BeagleBoneBlackで学ぶYoctoLinuxの基礎 (3)](https://qiita.com/Soramame11/items/6a5c2afd59745770c72f)にて、CMakeを使ったHelloWorldのビルドまで完了したため、次はVSCodeを利用したリモートデバッグの仕組みを作成する。

大まかには以下の手順となる。scp及びsshはターミナルエミュレータからも可能だが、すべてをVSCodeで完結させるため、`tasks.json`を定義し、ビルド後のイメージの転送とgdbserverの起動をVSCode上から実施できるようにした。

大まかには以下の手順でデバッグが可能となる。

- scpを使って__a.out__をBBBに転送
- sshを使って、BBB上で__a.out__のgdbserverを起動する
- VSCodeからgdbを使って接続する

## 振り返り

[BeagleBoneBlackで学ぶYoctoLinuxの基礎 (2) ](https://qiita.com/Soramame11/items/aef75c5bb02bb9be7455)より、BBBはipアドレス:`192.168.100.19`を利用していることがわかっている。

## `tasks.json`の作成

`.vscode.`内部に、以下の通り`tasks.json`を作成した。

- `bbb-download`にて`a.out`をBBBに転送
- `bbb - rungdb`にてBBB上でgdbserverを起動
 
`scp`及び、`ssh`実行時にパスワード認証が必要となるが、毎回入力する必要があり煩わしく感じたため、`sshpass`を利用した。また、仮に、転送先: `/home/user`及び、ポート番号`1234`を設定した。

```json:tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "bbb - download",
            "type": "shell",
            "command": "sshpass -p user scp -r ${workspaceFolder}/build/a.out user@192.168.100.19:/home/user"
        },
        {
            "label": "bbb - rungdb",
            "type": "shell",
            "command": "sshpass -p user ssh user@192.168.100.19 \"gdbserver localhost:1234 /home/user/a.out\""
        }
    ]
}
```

これにより、VSCodeのコマンドパレット(Ctrl-p)より、`Tasks: Run Task`を実行することにより各タスクを呼び出すことが可能となる。また、呼び出し時にVSCodeのTerminalにその結果が出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198826/d8de99eb-8893-e04c-2463-58993c08f965.png)

`bbb - download`、`bbb - rungdb`を順に実行すると、Terminal上にgdbserverが1234ポートをListenしていることが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198826/82bb314e-ac3e-4011-1b1b-8c2eb15a1866.png)

## `launch.json`の作成

デバッグ環境を定義するために、`.vscode`内に以下の通り`launch.json`を作成した。

| 項目 | 説明 |
| :--- | :--- |
| name | お好みで |
| program | デバッグ対象の実行ファイル |
| miDebuggerServerAddress | 接続先のgdbserverのIPアドレスとポート番号 |
| miDebuggerPath | sdkに含まれるgdb |

```json:launch.json
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) bbb - Remote",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/a.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "miDebuggerServerAddress": "192.168.100.19:1234",
            "miDebuggerPath": "/opt/poky/3.1.6/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux/arm-poky-linux-gdb",
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}
```

VSCode上でデバッグマークを選択すると、デバッグ環境の選択に`(gdb)bbb - remote`が選択可能となり、__RUN AND DEBUG__の右側の緑矢印を選択すればデバッグが可能となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198826/a6630d03-0a1a-6bdd-9ba6-8322778f7058.png)

## まとめ

- BBB上で動作するLinuxに対するリモートデバッグ環境を作成した
- すべてVSCode上で実行するため、taskを利用した
- Local変数、Callstack等も見れていい感じ