ということを、ちょっとだけやってみたので、書き残しておく。
ただ結論からいうと、満足いく成果は得られてない。
RustでもDevToolsしたい
JSばっかりやってる身としては、もちろんconsole.log()
も使うけど、デバッグにはやっぱりdebugger
を使いたい。
ChromeでもFirefoxでもいいけど、DevToolsで変数やスコープやコールスタックを見ながら、ステップインして・・・みたいなことがしたい。
でもRustでそもそもそんなことは可能なのか?ってところからのスタートではあったけど、調べてみると一応できるみたい。
gdb
とlldb
とrust-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
か?ってなってる。