Mozillaは先頃、GDBやLLDBなど標準的なデバッガを使用して、ブラウザ外でWebAssemblyバイナリをデバッグするデモを行った。本番環境で使用されるのと同じ実行環境でWebAssemblyコードをデバッグすることで、同じコードのネイティブビルドでは発生しない可能性のあるバグを捕捉し、診断することができる。
WebAssemblyは、WASIと結合されたことによって、ブラウザ外での使用に向けて大きく前進し、"Write Once、Run Anywhere"の公約を実現した。
ブラウザ外でのWebAssemblyプログラムの実行はこれまでも可能だったが、特にwastime
の使用において、デバッグ方法に難しい部分があった。WASIによってconsole
ロギングを使用したプログラムの実行レポートは可能になったが、元のソースをデバッグすることはできなかったのだ。rustwasm
の資料では、RustソースをWebAssemblyにコンパイルする場合を例として、問題点が説明されている。
現在はデバッガの提供するユーティリティに制限があるため、最終的には、作成したRustのソーステキストではなく、コンパイラが生成した生のWebAssembly命令がステップ実行されます。
今回、GDBやLLDBなどの従来のツールを使用した、.wasm
ファイルのソースレベルのデバッグが可能になった。
Mozillaが最近公開されたスクリーンキャストでは、FizzBuzz問題のソリューションを実装した、Rustから生成したWebAssemblyプログラムをLLDBでデバッグする様子が示されている。スクリーンキャストは、最初にcargo
を含むRustコードをWebAssemblyにコンパイルし、wasmtime
を使用して生成されたwasmコードを実行する。続いて、LLDBを使用して、wasmコードにデバッグ情報を組み込んでいる。
lldb -- wasmtime -g target/wasm32-wasi/debug/fizz.wasm
ここまで完了すれば、ブレークポイント(例えば"breakpoint set -name fizzbuzz
")、ソースレベルのナビゲーション、プログラムの実行中断時の変数の検査と変更、スタックフレームの表示とナビゲートといった一般的なデバッグ機能を、LLDBのコマンドラインインターフェースまたはグラフィカルインターフェースで使用することができる。
Mozillaは、ソースレベルのデバッグがWebAssemblyの開発者にどのように役立つかを説明している。
Wasmtimeのデバッグサポートにより、同じコードをネイティブビルドした場合には発生しない可能性のあるバグを簡単に捕捉し、診断することができます。例えば、WebAssemblyシステムインターフェイス(WASI)では、従来のUnixスタイルのアクセス許可よりも厳密にファイルシステムアクセスを扱っています。これが原因で、WebAssemblyランタイムでのみ現れる問題が発生する可能性があるのです。
LLVMプロジェクトは、モジュール式で再利用可能なコンパイラおよびツールチェーンテクノロジーのコレクションである。LLVMが提供するライブラリをベースに構築され、ネイティブデバッガを提供する。
GDB(GNU Projectデバッガー)は、C++、Rust、Go、Objective-C、Ada、Assembly、C、D、Fortran、OpenCL、Modula-2、Pascalといった言語をサポートするデバッガである。
WASI(WebAssembly System Interface)は、セキュリティと移植性を重視した WebAssembly用のモジュラーシステムインターフェイスである。標準パス上に位置し、任意のデバイス、コンピュータ、あるいはオペレーティングシステム上でWebAssemblyプログラムを実行可能にすることがその目標だ。
Wasmtimeは、WebAssemblyのスタンドアロンJITスタイルのランタイムである。Wasmtimeランタイムのチュートリアルには、CおよびRustからWASIをターゲットにする方法の例が含まれる。結果生成される.wasm
モジュールは、WasmtimeやFastly's LucetなどのWASI準拠のランタイムで実行できる。