みなさんこんにちは、電通国際情報サービス(ISID)Xイノベーション本部ソフトウェアデザインセンターの佐藤太一です。
最近、Rustにさわり始めたのでWindowsユーザー向けの開発環境を構築する手順をご紹介します。
前回書いたGitワークフロー設計についてという記事は重厚でしたが、今回は軽めです。
Microsoftの用意している手順通りにインストールする
基本的には、以下のページに書いてある通り手順を進めていけば開発環境を構築できます。
このページを読んで分かり辛い部分を補足します。
Microsoft C++ Build Tools と Visual Studioのどちらをインストールするのか?
Microsoft C++ Build Tools をインストールしてください。
VS Codeで使えるRust用拡張は複数あるが?
rust-analyzer と Rust support for Visual Studio Code という二つの拡張があります。
Rust公式なのはRust support for Visual Studio Codeですが、開発が活発でより多機能なのはrust-analyzerです。
つまり、rust-analyzerがおすすめです。
- rust-analyzerはVS Code拡張とLSPサーバの実装が単一のgitリポジトリに入っています
- Rust support for Visual Studio CodeはVS Code拡張とLSPサーバの実装が別なリポジトリになっています。
デバッガーは何を使えばいい?
デバッグしてたらマシン語みたいなものが出てきた
こういうのが画面に出力されたらびっくりしますよね。分かります。
これを解決するための手順をこの後で説明します。
デバッグ時にソースコードをアタッチする方法
まずは、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の内容次第で詳細は違うでしょうが、似たようなファイルが作成されれているはずです。
このJSONにsourceMap
というキーで先ほど設定したのと同じ値を設定したものがこれです。
{ "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.kazuhiro (Shodoで執筆されました)