何をするツールか
.wasm ファイルを読み込み、中身を WAT(テキスト形式)・hex(生のバイト列)・セクション構造の 3 つの見方で同時に表示します。どこにカーソルを乗せても、他の 2 つの対応する場所が光ります。解析はすべてブラウザ内で行い、ファイルは送信しません。
画面
| 左 | 読み込み、ファイル情報、セクション一覧(サイズのバー付き)、関数一覧(未入力時はサイズ順) |
| 中央 WAT | MODULE → セクション → 関数 の順に開いていく階層表示。左端の数字はその行のバイトオフセット |
| 中央 STATS | セクション別サイズ、大きい関数、使用している機能(SIMD / Threads など)、オペコードの出現頻度 |
| 右 HEX | ファイル全体のバイト列。文字色はセクションの種類(凡例は下)。code セクション内は関数ごとに明暗が交互になる |
| 右下 | ステータスバー。オフセット、範囲、所属(パス)、命令の意味とスタック効果、ソース位置を表示 |
マウス操作
| WAT の行にホバー | 対応するバイトが hex でオレンジに光る。命令ならオペコード部分が濃く、即値部分が薄く光る |
| WAT の行をクリック | 選択して緑で固定。ステータスバーの内容も固定され、REF↗ から命令リファレンスを開ける。セクションや関数の一覧行はクリックでその中へ移動 |
| call / global の行をダブルクリック | 呼び出し先の関数、またはグローバル変数の定義へ移動 |
| hex にホバー | そのバイトが何に属するか(どの命令のどの部分か)をステータスバーに表示し、WAT の対応する行が光る |
| hex をクリック | そのバイトを含む命令・エントリまで WAT で移動して選択 |
| 左のセクション / 関数にホバー | その範囲全体を hex で表示 |
| Shift + ホイール | WAT を横スクロール(長い行用) |
キーボード
| ? | このヘルプ |
| G | GOTO 欄へ。0x1a2b(16進オフセット)、#12(関数番号)、$main(関数名、前方一致) |
| / | 関数検索欄へ(Enter で先頭の候補を開く) |
| [ ] | 前 / 次の関数 |
| Backspace / Alt+← | 戻る |
| T | WAT と STATS を切り替え |
| S | 元ソースの行の表示を切り替え(DWARF があるときだけ) |
| L | 左パネルの表示を切り替え(狭い画面では既定で隠れ、重ねて表示) |
| Esc | 選択を解除 / 入力欄から抜ける / このヘルプを閉じる |
| WAT をクリックしてフォーカスしているとき |
| ↑ ↓ PgUp PgDn Home End | 選択行を移動(hex も追従) |
| Enter | 選択行を開く(一覧なら中へ、call なら呼び出し先へ) |
| ← → | 横スクロール |
元ソースの表示(DWARF)
-g 付きでビルドした .wasm には、命令と元ソースの行の対応表(DWARF の .debug_line)が入っています。これがあると、関数の WAT の間に ;; sample.c:31 │ … のように元ソースの行が挟まります。
- 行の中身まで出すには、.wasm を読み込んだ後に元のソースファイル(.c / .cpp / .rs など)をドロップします。ファイル名で照合します。複数まとめてドロップしても構いません。
- SRC ボタンか S で表示を切り替えられます。
- Emscripten なら
-g、clang なら -g、Rust なら debug = true のビルドが対象です。リリースビルドは通常 DWARF を含みません。
セクション早見表
| type | 関数の型(引数と戻り値の組み合わせ)の一覧 |
| import | JS(ホスト)側に用意してもらう関数・メモリ・テーブル・グローバル |
| function | モジュール内で定義する各関数が、どの型を使うか |
| table | 関数参照の表。C の関数ポインタは call_indirect でここを引く |
| memory | 線形メモリの初期サイズと最大サイズ(1 ページ = 64KiB) |
| global | グローバル変数。C のビルドではスタックポインタがここに入る |
| export | JS から呼べる関数などの一覧 |
| start | インスタンス化の直後に自動で呼ばれる関数 |
| element | table の初期値(関数ポインタの並び) |
| code | 各関数の本体(ローカル変数の宣言と命令列) |
| data | 線形メモリの初期内容。文字列リテラルや定数テーブル |
| custom | 実行には使われない付加情報。name(関数名)、producers(ビルドツール)、.debug_*(DWARF)など |
表示の補足
i32.const 1024 ;; "PROTOCOL.LAIN" のように、data セグメントの中を指す定数には、その位置にある文字列(読めない場合は data[n]+offset)を表示します。 - ステータスバーの
op 1 + imm 2 は、その命令がオペコード 1 バイトと即値 2 バイトでできているという意味です。即値は LEB128 という可変長形式なので、値によって長さが変わります。 - 関数名は name セクションから取ります。なければ import / export の名前を使い、それもなければ番号だけになります(リリースビルドの多くはこの状態です)。
- STATS の機能判定は、全関数の命令をスキャンして実際に使われているオペコードから決めています。
- 浮動小数点の定数は 10 進で表示します(wasm2wat は 16 進表記)。値は同じです。
未対応
- GC proposal(0xFB 系の命令と再帰型)— その関数は途中まで表示します
- Component Model 形式のファイル
- DWARF は行番号の対応のみ(変数の位置や型情報は表示しません)