プログラミングを学ぶ人は、まずデバッガーの使い方を覚えるのがいいと思います。デバッガーで一行づつ実行しながら変数の中身を確認していけばプログラムの動きがイメージしやすいからです。printfデバッグはだいたいどの環境でもできるのでその意味では楽なのですが、ソースレベルでバッグができるに越したことはありません。そういえばGLSLとかprintfデバッグすら無理なので一番つらかった……。
wasm::trace関数を使う
WASM-4でデバッグプリントを行うには、trace
関数を呼び出します。Rustの場合はformat!
マクロと組み合わせて
trace(format!("x: {}, y: {}", player.position.x, player.position.y));
みたいな感じにするといいようです。(C/C++のみ、フォーマットと出力を同時に行うtracef
関数が使えます)
ちなみに、Rust標準の出力関数であるprintln
とかを呼ぼうとしたら、note: rust-lld: error: initial memory too small, 66848 bytes needed
とか言われてビルドに失敗しました。よくわかりませんが、まあprintln
は使えないみたいです。
C/C++ DevTools Support (Rustをサポートしないとは言っていない)
それで開発を始めた当初はtrace
ですべてをしのいでいたのですが、さすがにソースレベルでバッグができないと辛くなってきました。WASM-4ではRustをWASMにコンパイルしてブラウザで読み込みますが、ChromeのDevtoolsを開いて適当に実行を中断すると、普通に生WASMが表示されます。もちろん私はWASMなんて読めるわけがありません。
生WASM見せられても読めるわけないだろ!
— Cubbit (@cubbit2) October 28, 2022
いいかげんにしろ!
頼れるのはデバッグプリントだけニャンね……(とか言いながら半年後くらいにはなんとなく読めるようになっていそう) pic.twitter.com/z85O8G4vm9
というようなことをツイートしていたら、 YutakaAoki3 さんにソースレベルデバッグできるよと記事を教えてもらいました。
なんかこの記事見覚えあるなと思ったら、"in particular, for C and C++ apps." とあって いやC/C++って書いてあるし、これ探してるのと違うやつかな…… と思って冒頭だけ読んでスルーしたような記憶があります。半信半疑ですが、記事にしたがって C/C++ DevTools Support (DWARF) というのをインストールしてみます。
み゛ょ゛っ゛……!?(衝撃) Chromeに拡張をインストールしただけなのに、RustのソースコードがDevtoolsに表示されてソースコードレベルでバッグができています。変数の中身も普通に覗けました。こんなに簡単にできるようになるなんてありがたや。これで寿命が10年は伸びましたね。というわけで、C/C++ DevTools Support (DWARF)という拡張をインストールしようね、というだけの回でした。
次回予告
次回からは少しプラットフォーマーっぽいプログラミングをしていきます。