電通総研 テックブログ

電通総研が運営する技術ブログ

Windows10で動くVSCodeにRustの開発環境を作る

みなさんこんにちは、電通国際情報サービス(ISID)Xイノベーション本部ソフトウェアデザインセンターの佐藤太一です。

最近、Rustにさわり始めたのでWindowsユーザー向けの開発環境を構築する手順をご紹介します。

前回書いたGitワークフロー設計についてという記事は重厚でしたが、今回は軽めです。

Microsoftの用意している手順通りにインストールする

基本的には、以下のページに書いてある通り手順を進めていけば開発環境を構築できます。

このページを読んで分かり辛い部分を補足します。

Microsoft C++ Build Tools と Visual Studioのどちらをインストールするのか?

Microsoft C++ Build Tools をインストールしてください。

VS Codeで使えるRust用拡張は複数あるが?

rust-analyzerRust support for Visual Studio Code という二つの拡張があります。

Rust公式なのはRust support for Visual Studio Codeですが、開発が活発でより多機能なのはrust-analyzerです。

つまり、rust-analyzerがおすすめです。

デバッガーは何を使えばいい?

デバッグしたいならCodeLLDB がおすすめです。

デバッグしてたらマシン語みたいなものが出てきた

こういうのが画面に出力されたらびっくりしますよね。分かります。

これを解決するための手順をこの後で説明します。

デバッグ時にソースコードをアタッチする方法

まずは、rustの標準ライブラリが置いてあるディレクトリを調べます。 rustup show を実行してみましょう。筆者の環境では以下のように出力されました。

Default host: x86_64-pc-windows-msvc
rustup home:  C:\Users\taichi\scoop\persist\rustup-msvc\.rustup

stable-x86_64-pc-windows-msvc (default)
rustc 1.57.0 (f1edd0429 2021-11-29)    

rustup home と (default) が末尾に付いているtoolchain名を後で使います。

次にライブラリのバージョンとコミットハッシュを調べるために、rustc --version --verbose を実行します。筆者の環境では以下のように出力されました。

rustc 1.57.0 (f1edd0429 2021-11-29)
binary: rustc
commit-hash: f1edd0429582dd29cccacaf50fd134b05593bd9c
commit-date: 2021-11-29
host: x86_64-pc-windows-msvc
release: 1.57.0
LLVM version: 13.0.0

ここで使うのは、 commit-hash ですね。この例では f1edd0429582dd29cccacaf50fd134b05593bd9c となっていますね。

そしてワークスペースの設定をするために .vscode/settings.json を作成します。

{
  "lldb.launch.sourceMap": {
    "/rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c": "C:\\Users\\taichi\\scoop\\persist\\rustup-msvc\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\src\\rust"
  }
}

lldb.launch.sourceMapソースコードをアタッチするための設定項目です。この設定項目ではキー部分に、アタッチしたいソースコード名前空間を設定します。そして、値部分にソースコード絶対パスを設定します。

今回のケースでは標準ライブラリにソースコードをアタッチしようとしています。 /rustc/プレフィックスで、その後ろにコミットハッシュである f1edd0429582dd29cccacaf50fd134b05593bd9c を連結していますね。

ソースコード絶対パスは 先ほど調べた rustup home に .rustup\\toolchains 、そして toolchain名 、末尾に lib\\rustlib\\src\\rust を連結しています。

ここまでの説明を図にするとこうなります。

筆者の環境は日本語Windowsなのでファイルパスの区切り文字はエンサインです。そのままJSONに書いてしまうと期待通りの値にならないので、エンサインを重ねてエスケープしています。

ここまで設定したら、ソースコード上に表示された Debug をクリックしてデバッグ実行できます。

デバッグビューからの起動にソースコードをアタッチする方法

CodeLLDBにはデバッグを開始する方法が二つ用意されています。一つ目は、既に説明した方法です。 これから説明するのは、VS Codeデバッグビューから実行する方法です。

まずは、CodeLLDBの機能を使ってlaunch.jsonを自動生成しましょう。 この Run and Debug ボタンを押すとモーダルダイアログが2回程出力されますので、それぞれOKとYesを押してください。

出力されたlaunch.jsonの中から説明に必要な部分だけを抜粋したのが、以下のJSONです。

{
  "type": "lldb",
  "request": "launch",
  "name": "Debug executable 'learn-rust'",
  "cargo": {
    "args": [
      "build",
      "--bin=learn-rust",
      "--package=learn-rust"
    ],
    "filter": {
      "name": "learn-rust",
      "kind": "bin"
    }
  },
  "args": [],
  "cwd": "${workspaceFolder}"
}

ワークスペースのルートディレクトリにあるCargo.tomlの内容次第で詳細は違うでしょうが、似たようなファイルが作成されれているはずです。

このJSONsourceMap というキーで先ほど設定したのと同じ値を設定したものがこれです。

{
      "type": "lldb",
      "request": "launch",
      "name": "Debug executable 'learn-rust'",
      "cargo": {
        "args": ["build", "--bin=learn-rust", "--package=learn-rust"],
        "filter": {
          "name": "learn-rust",
          "kind": "bin"
        }
      },
      "args": [],
      "cwd": "${workspaceFolder}",
      "sourceMap": {
        "/rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c": "C:\\Users\\taichi\\scoop\\persist\\rustup-msvc\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\src\\rust"
      }
    }

このように設定した上で、デバッグビューのデバッグ開始ボタンを押すと標準ライブラリにソースコードがアタッチされた状態でデバッグできます。

さいごに

Rustで快適にデバッグする環境ができましたと言えれば、非常に良いのですが、実はまだ課題があります。

デバッグ実行時に日本語を標準出力するといわゆる文字化け状態になってしまいます。

デバッグ実行しなければ文字化けしないので、恐らくCodeLLDBの問題であろうと類推しているのですが、上手く解決できていません。

解決方法をご存じの方がいらっしゃったら是非共有してくださると非常にありがたいです。

追記:rust-analyzer は Rust 公式になりそうです。

執筆:@sato.taichi、レビュー:@mizuno.kazuhiroShodoで執筆されました