🧊

Rustのコードを`rust-lldb`でデバッグする

ということを、ちょっとだけやってみたので、書き残しておく。

ただ結論からいうと、満足いく成果は得られてない。

RustでもDevToolsしたい

JSばっかりやってる身としては、もちろんconsole.log()も使うけど、デバッグにはやっぱりdebuggerを使いたい。

ChromeでもFirefoxでもいいけど、DevToolsで変数やスコープやコールスタックを見ながら、ステップインして・・・みたいなことがしたい。

でもRustでそもそもそんなことは可能なのか?ってところからのスタートではあったけど、調べてみると一応できるみたい。

gdblldbrust-lldb

あまり情報がないのか、ただ自分が無知なのか、このあたりの前提知識も理解するまで時間がかかった。

自分なりの解釈(間違ってたら教えてください)を書いておくと、

  • gdb: CとかC++とか、そういう歴史ある言語から対応してる由緒あるデバッガ
    • しかしSiliconなmacで動かない
  • lldb: モダンなgdbで、XCodeが入ってればもうパスが通ってる
    • だが、Rustを直接サポートしてない?らしく、そのまま使うのはつらいらしい
  • rust-lldb: lldbのRust用のラッパーで、Rustが使えるなら既にインストールされてる

というわけで、rust-lldbを使えばよいのかな・・・?って感じで試した。

最低限の使い方

おもむろにcargo init helloしたプロジェクトを用意する。 たとえばこんな最低限の内容から。

fn main() {
    let x = "X";
    let text = greet(x);

    println!("{text}");
}

fn greet(name: &str) -> String {
    let ret = format!("Hello, {name}!");
    ret
}

まず、対象のコードをデバッグビルドする。

cargo buildすると、デフォルトでは+ debuginfoってなってるので、これでいいはず。

そして、rust-lldbを起動する。

rust-lldb ./target/debug/deps/hello-11926507bb6d9055

ファイル名のハッシュみたいなところはビルドすると変わる。

ともあれこれでLLDBのセッションに入れたはず。抜ける時はqで。

ここからはLLDBのコマンドを使っていく。helpって打つとすごいいっぱいあるのがわかる。

GDB to LLDB command map - 🐛 LLDB https://lldb.llvm.org/use/map.html

デバッガを起動しただけでプログラムはスタートしてないので、rでコードをスタートする、引数があるならココで渡せる。

ただこれだと単にプログラムを実行して終わりになっちゃうので、ブレークポイントを指定する。

  • b main: main関数にブレークポイントを指定
    • 他にもファイル名とか行数とかも指定できる

コマンドには短縮系がいろいろあるみたいなので、逐一調べないといけない。

この状態で再びrすると、おそらく最初は機械語の羅列みたいな場所に降り立つはず。

そしたらあとは、

  • c: ブレークポイントまで進む
  • n: ステップオーバー
  • s: ステップイン
  • finish: ステップアウト
  • v: そのフレームでの変数一覧

という感じでデバッグできる。

コマンドを打つたびにコンソールがちょっとずつ流れていく・・・。 やれんことはないけど、だいぶきびしい。

main.rsがあるならこのやり方よくて、もしlib.rsしかない場合は、examplesを用意して、それをデバッグビルドすればよい。

GUIがほしい!

LLDBのセッション中にguiといれると、ターミナル上でそれらしい2カラムのTUIは表示される。

なんか変数一覧も自動で表示してくれるしこれでいいのでは! って一瞬なったけど、通常のLLDBセッションとまたコマンドが微妙に違う?感じがして、どうもしっくりこない。

調べてみたら、なんかそういうものらしい。

user interface - Documentation for LLDB’s GUI - Stack Overflow https://stackoverflow.com/questions/27957058/documentation-for-lldbs-gui

それにやっぱDevToolsと比較するとなぁ〜。

都合よくGUIを作ってる人はいないだろうかと探したけど、見つけられなかった。 というか、みんな志半ばで終わってるように見えた。

GUIを求めて

かといって、LLDB DAPをがんばって理解してGUIを作ってやる!という気概はない。

https://github.com/llvm/llvm-project/tree/main/lldb/tools/lldb-dap

となると、この先にあるのはもうVSCodeでCodeLLDB拡張を入れるとかになるのであろう。

vadimcn/codelldb: A native debugger extension for VSCode based on LLDB https://github.com/vadimcn/codelldb

Nvim方面だと、nvim-dap + nvim-dap-ui + nvim-dap-virtual-textという感じ?

ただNvimでやるべきことか?中途半端なTUIはまたDevToolsと比較しちゃうのでは?って思ってしまう自分がいて腰が重い。

launch.jsonは必要な税金と捉えて、試すならVSCodeかな〜。エディタとしてではなく、あくまでデバッガーとして。 いやでもやっぱこういう時、VSCodeは強いよな〜やっぱもう長いものに巻かれる時がきたか?とりあえずvscode-neovimか?ってなってる。