ちょっと思い立ってRustを勉強するかと取り組み始めたもののデバッグ環境構築で手こずった件の覚書。
作業ディレクトリをユーザードキュメント以下ではない任意の場所に配置した際にCodeLLDBでのデバッグ起動がうまくできなかった。
ひとまず期待した状態にはなったので記録しておく。
もっと調べると正規の作法がありそう。検索するにもキーワードをうまく用意できず…。EdgeのCopilotあたりを使うにしても自分の指示能力が低くて嫌になる。
症状
CodeLLDBを使ったデバッグ起動ができない。ビルドまでは行ってくれる。
試した ./vscode/launch.json への記述はよく見かける記事のようにcargoエントリを使った指定。
Launching a New Process @ codelldb/MANUAL.md
なおプロジェクトがユーザーディレクトリの Documents 以下にある場合は期待通りに起動できる。
環境
OSはWindows 11。Dドライブの任意の開発作業用ディレクトリ以下にプロジェクトを生成。
使用しているツール類は次のような感じ。
Visual Studio Code | 1.84.2 | |
Visual Studio Build Tools 2022 | 17.8.2 | |
rustc | 1.74.0 | |
cargo | 1.74.0 | |
rust-analyzer | v0.3.1748 | VSCode extension |
CodeLLDB | v1.10.0 | VSCode extension |
何が起きている?
これを書いている時点では結局解明していない。
きちんとログを追えばおそらくわかるはず。そこまでのやる気が…
ビルド成果物のパス探索の問題と予想していてCodeLLDBの設定で対応できると考えている。
対応
launch.jsonの用意
CodeLLDBのドキュメントを見ると単純にデバッグ起動する書き方は実はcargoエントリを使わない。
Starting a New Debug Session @ codelldb/MANUAL.md
こちらの書き方であればデバッグ起動できるのでアレンジを試みる。
なお公式ドキュメントにある<executable file>は<executable file>のことなのでパスを明示する必要がある。
公式サンプルの書き方ではプロジェクトの起点ディレクトリ直下に実行ファイルが配置されている想定なのでcargoを使ったデバッグビルドのディレクトリの階層の追記が必要。
そして次のようになる。
今回はアプリケーションとプロジェクトディレクトリを同じ名前とする想定の書き方。
{
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug executable",
"program": "${workspaceFolder}/target/debug/${workspaceFolderBasename}",
"args": [],
"cwd": "${workspaceFolder}",
"preLaunchTask": "rust: cargo build"
}
]
}
最後のpreLaunchTaskというエントリがポイントになる。
公式サンプルのlaunch.jsonの延長ではビルド済みの実行ファイルを起動してくれるだけでビルドは行ってくれない。
毎回別途ビルドするのはさすがにだるい。
そこで実行前に別のタスクを起動しそのタスクでビルドを行うことにする。
タスクの起動指定がpreLaunchTask。
ここでしているタスク「rust: cargo build」は実はVSCode向けに用意されたcargoの標準タスクの一つ。
記述内容はGUIを通してテンプレートをもとに実体化することで確認できるがさっくり説明すると次の内容。
{
"type": "cargo",
"command": "build",
"problemMatcher": [
"$rustc"
],
"group": "build",
"label": "rust: cargo build"
}
labelをlaunch.jsonのpreLaunchTaskで指定していることになる。
実行
これらの用意ができていればF5キーでのデバッグ実行でビルドからのアプリケーション起動が行えるはず。
おまけ:テンプレートからtasks.jsonを生成
Terminal -> Run Task -> cargo と選択していくと次のようなダイアログが表示される。
その中の「rust: cargo build」の行の右側の歯車アイコンをクリックする。
すると ./vscode/tasks.json にCargoビルドのエントリが追加される。