mizdra's blog

ぽよぐらみんぐ

VS Code でデバッガーを使って oxc の挙動を観察したい

oxc の挙動を観察したいな〜と突然思って、oxc のデバッグ環境を VS Code で用意した。ちょっと躓いたのでメモを残しておく。

やりたいこと

  • oxc のテストを VS Code から実行したい
  • しかも VS Code 上から breakpoint を設定して、テストをステップ実行したい

Requirements

以下は事前にインストールしておく。

  • VS Code
  • Rust
  • rust-analyzer 拡張機能
    • rust-analyzer という Rust 向けの Language Server があって、それを VS Code から使うための拡張機能
    • VS Code からテストを実行するための UI も提供してくれる
      • プロジェクト内のテストケースを抽出して「Test Explorer」にそれを表示してくれたり
      • #[test] のすぐ下にインラインで「Run Test」「Debug (デバッガーを attach しながらテストを実行するモード)」ボタンを表示してくれたり
  • CodeLLDB 拡張機能
    • LLDB というデバッガーがあって、それを VS Code から使うための拡張機能

あと oxc のリポジトリも git clone して Contribution Guide を見ながらセットアップしておく。

breakpoint で止まらない

「Debug」ボタンからテストを実行しても、何故か breakpoint で止まらずに完走してしまう。

「Debug」ボタンからテストを実行したのに、breakpoint で止まらずに完走してしまう様子

最初は rust-analyzer/CodeLLDB 拡張機能の設定が不十分なのかと思ったけど、特に怪しい設定もない。となるとテスト時に実行されるバイナリがなんかおかしいのか? と疑い始める。

テスト時に実行されるバイナリ

じゃあテスト時に実行されるバイナリはどこにあるのか。これは CodeLLDB 拡張機能のログを見るとわかる。

まず VS Code の下部のメニューの「OUTPUT」をクリックし、その次に拡張機能のリストから「LLDB」を選択。そうして表示されるログの先頭のほうに、program という項目があり、その値がテスト時に実行されるバイナリのパスになってる。
OUTPUT > LLDB と辿っていた先に拡張機能のログがあり、そこに書いてある

この program の部分がテスト時に実行されるバイナリになってる。実際に引数を伴って実行してみると、テストが実行できる。

$ ./target/debug/deps/oxc_parser-992051aabfe995a6 module_record::module_record_tests::import_default --exact --show-output

running 1 test
test module_record::module_record_tests::import_default ... ok

successes:

successes:
    module_record::module_record_tests::import_default

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 53 filtered out; finished in 0.00s

バイナリの中身を見る

まあ多分シンボル情報が入ってないんじゃないか、と思うので中身を見てみる。macOS なら dsymutil コマンドなどでできるらしい。

$ dsymutil --statistics target/debug/deps/oxc_parser-992051aabfe995a6
warning: no debug symbols in executable (-arch arm64)
.debug_info section size (in bytes)
-------------------------------------------------------------------------------
Filename                                           Object         dSYM   Change
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Total                                                  0b           0b    0.00%
-------------------------------------------------------------------------------

warning: no debug symbols in executable を見るに、やっぱりシンボル情報入ってなかったね... これなら breakpoint 仕掛けても止まらないの当然だ。

何故シンボル情報が含まれてないのか

普通テストを実行する際はデバッグビルドが実行されて、シンボル情報が埋め込まれるはず。なのに何故埋め込まれていないのか。その理由は oxc リポジトリの Cargo.toml に書いてあった

// https://github.com/oxc-project/oxc/blob/ea3f362173247454190a737b9c0737fb26f43a3f/Cargo.toml#L241-L244 より引用
[profile.test]
# Disabling debug info speeds up local and CI builds,
# and we don't rely on it for debugging that much.
debug = false

コメントなるほどね... debug = true にして無事解決しました。

ポケットモンスター・ポケモン・Pokémon・は任天堂・クリーチャーズ・ゲームフリークの登録商標です.

当ブログは @mizdra 個人により運営されており, 株式会社ポケモン及びその関連会社とは一切関係ありません.