【Rust】VSCodeを使ったDockerコンテナ上のRustアプリケーションをデバッグする方法

## はじめに
最近Rustを触り始めて、コンパイラに怒られる日々を送っているTomoProgです。
この記事ではVSCodeを使い、Dockerコンテナ上で構築したRustアプリケーションをデバッグする方法を説明します。

## この記事の対象者
- Docker上のRustアプリケーションのデバッグ方法を知りたい方

## 前提
Rustアプリケーションが起動するDockerコンテナが起動していることを前提に話を進めます。
こちらの記事を参考にする場合はDockerコンテナを起動した状態で試してみてください。

## 筆者の環境
筆者がデバッグ環境を構築した際の環境を載せておきます。
この環境通りでなくても、VSCodeとDockerがインストールされていれば構築できると思いますので、試してみてください。

- OS

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"
```

- VSCode

```
$ code -v
1.47.2
```

- Docker

```
docker -v
Docker version 19.03.12, build 48a66213fe
```

## VSCodeからDockerコンテナに接続する
まずはVSCodeからDockerコンテナに接続できるようにします。
Dockerコンテナへの接続には`Remote-Containers`という拡張機能を使います。
`Remote-Containers`は`VSCode Remote Development`の機能の1つで、この拡張機能を使うことで、Dockerコンテナ内のファイルを直接操作できたり、VSCodeの拡張機能をコンテナ内にインストールできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/dd8ae65a-0df4-a328-6f56-e9a52147d2ba.png)
インストールが終わると画像のように画面の左下に緑色のアイコンが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/4c7121a6-782b-0cf6-1d17-b7bccd3375a0.png)
このアイコンを押すと、`Remote-Containers`のメニューが表示されるので、`Attach to Running Container...`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/697628ae-3931-ed36-ad48-3667abda7739.png)
選択すると起動しているDockerコンテナが表示されますので、Rustアプリケーションが起動しているDockerコンテナを選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/346be627-50fc-1c12-1dd9-170ca4900cc9.png)
VSCodeが新しく立ち上がり、左下の緑色のアイコンが選択したコンテナになっていれば接続成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/057426f0-7116-4662-7a84-da7d18f712d9.png)
もし、以下のようなメッセージが出た場合はdockerコマンドをsudoなしで使用できるようにする必要があります。[こちら](https://docs.docker.com/engine/install/linux-postinstall/)を参照し設定してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/dff47d4e-eab2-83fe-50bb-bd5bef7497fd.png)

## Docker上のRustアプリケーションがあるフォルダを開く
次はRustアプリケーションがあるフォルダを開きます。
VSCodeのエクスプローラから`フォルダーを開く`を選択し、Dockerコンテナ内のRustアプリケーションのフォルダを指定します。
筆者の環境では`/work/hello/`がRustアプリケーションのフォルダなのでここを指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/b3abaeea-054e-95a4-803a-f6a5737d474d.png)
画像のように指定したフォルダの中身がVSCodeのエクスプローラに表示されれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/1c5a12f3-11c4-ab37-71ef-d85992853595.png)

## デバッガをインストールする
次はデバッガをインストールしていきます。
デバッガには`CodeLLDB`という拡張機能を使います。
`CodeLLDB`は`LLDB`というデバッガをVSCodeで利用できるようにする拡張機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/1f960951-60ed-3839-87aa-b1f9bd88ff4c.png)

インストール完了後、インストールされている拡張機能を確認し、画像のようにLOCALではなくCONTAINERの方に`CodeLLDB`がインストールされていればデバッガのインストールは完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/0dadc366-01ef-1fa2-fe69-8ea8cfccf2d6.png)

## launch.jsonを作成する
`LLDB`を使用したデバッグができるように`launch.json`を作成します。
実行タブを開き、`launch.jsonファイルを作成します`を選択し、`LLDB`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/a20189b1-d344-4661-6bcb-a708e1380559.png)
`Cargo.toml`が存在すると以下のようなメッセージが表示されるため、「はい」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/5768d4ba-060c-d60b-2cd4-543e20d6559d.png)
「いいえ」を選択しても`launch.json`は作成されますが、「はい」にすると環境に適した`launch.json`を自動で作成してくれるため、非常に便利です。
この記事では「はい」を押して自動生成された`launch.json`を使用しています。

画像のようにエディタに`launch.json`が表示されれば作成完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/e5b46f31-1944-3a41-a294-dbb2726c7453.png)

ここまで設定すればデバッグ環境の構築は完了です。

## デバッグする
それでは早速デバッグしてみましょう。
プログラムを一時停止したいところにブレークポイントを設定し、画像左上の再生ボタンを押せばデバッグが始まります。
ブレークポイントはエディタの行番号の少し左をクリックすると、画像のように赤い丸が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/c40cc1b0-5501-61eb-d18d-c8372438013f.png)
画像のように設定したブレークポイントの位置でプログラムが止まれば成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68663/92799e08-1108-a247-aadd-b399a63464bc.png)
あとはウォッチ式に変数を追加したり、ステップ実行してみたり色々試してみてください。

## まとめ
VSCodeを使ってDockerコンテナ上のRustアプリケーションのデバッグ方法をまとめました。
Dockerコンテナ上のデバッグは何かと面倒なイメージでしたが、`VSCode Remote Development`が登場したことにより、かなり簡単に設定できるようになり感動しました。

それでは良いRustライフを！

TomoProg