WebAssemblyにDOMなどのWebブラウザのAPIが追加されるというニュースが出ました。これでさらに利用が拡大していくことでしょう。そんなWebAssemblyにはテキスト版とバイナリ版が存在します。 そのテキスト版であれば、まだ人にも理解しやすいものです。そしてWasabiを使えば実行時にインジェクションしてデバッグしやすくなります。

Wasabiの使い方

WebAssemblyの例です。分からない訳ではないが…といった感じです。

(module
    ;; import function for printing integers from host environment
    (import "env" "print" (func $print (param i32)))
    ;; make main function available to the host environment
    (export "main" (func $main))

    (func $main
        ;; print 42 via the imported function
        i32.const 42
        call $print

        ;; call the function with index $loop
        call $loop
    )
    :
)

そしてWasabiを設定します。

// before each call, print function index and passed arguments
Wasabi.analysis.call_pre = function (location, func, args) {
    print(`call to function #${func} with arguments ${JSON.stringify(args)}`);
};

実行すると、関数を呼ばれたタイミングやその時の引数などが分かります。

call to function #0 with arguments [42]
42
call to function #2 with arguments []
call to function #0 with arguments [5]
5
call to function #0 with arguments [4]
4
call to function #0 with arguments [3]
3
call to function #0 with arguments [2]
2
call to function #0 with arguments [1]
1

Wasabiを使うことで、できあがったWebAssemblyのデバッグがしやすくなります。思った動作をしないときに使うと、関数がどう呼ばれているかが分かるでしょう。ただしテキスト版の WebAssemblyとて分かりやすいとは言いがたいので、デバッグするには慣れが必要そうです。

WasabiはRust製のオープンソース・ソフトウェア(MIT License)です。

Wasabi danleh/wasabi: A dynamic analysis framework for WebAssembly programs.