Utilia

WebAssembly-disassembler

Omdan en .wasm-binærfil til læselig WAT-tekst, validér den, og se dens sektioner, importer, eksporter og funktioner i din browser, uden at modulet køres.

Modulet læses og omdannes kun til tekst: det kompileres, instantieres eller køres aldrig.

Sådan omdanner du WASM til WAT

  1. Slip en .wasm-fil på feltet, eller klik på det for at vælge en (op til 20 MB). Du kan også trykke på Indlæs et eksempelmodul for at se en lille demo.
  2. Værktøjet tjekker binærfilen, validerer den og viser resultatet: ✓ Modulet er gyldigt. eller årsagen til, at det ikke er.
  3. Aflæs tællerne: Funktioner (importerede og definerede), Importer, Eksporter, Typer, Hukommelser, Tabeller og Globale.
  4. Læs disassemblyen i Tekstformat for WebAssembly (WAT), og Kopiér den eller tryk på Download .wat.
  5. Tilpas outputtet med indstillingerne: Brug navne fra navnesektionen, Foldede udtryk (S-udtryk) og Inline-eksporter.
  6. Åbn tabellerne Sektioner, Importer og Eksporter for at se filens opbygning: hver sektion med sin byteforskydning, størrelse og antal poster.

Modulet kompileres, instantieres eller køres aldrig. Værktøjet læser kun dets bytes og omdanner dem til tekst, så det er sikkert at undersøge en fil, du ikke stoler på.

Hvad WAT-outputtet viser

WebAssembly har to ækvivalente formater: den kompakte binærfil .wasm, som browsere og runtimes indlæser, og tekstformatet .wat, som er beregnet til mennesker. Disassembleren udskriver alle dele af modulet i tekstform: funktionstyper, importer, funktionslegemer, tabeller, hukommelser, globale variabler, eksporter, startfunktionen, elementsegmenter og datasegmenter.

Som standard står instruktionerne én pr. linje i stakrækkefølge, som de er gemt:

(func $add (param $a i32) (param $b i32) (result i32)
  local.get $a
  local.get $b
  i32.add)

Med Foldede udtryk (S-udtryk) er operanderne indlejret i den instruktion, der bruger dem, som i (i32.add (local.get $a) (local.get $b)), hvilket ofte er lettere at følge. Inline-eksporter skriver (export "add") inde i funktionen i stedet for i en separat liste.

Navne, fejlsøgningsoplysninger og validering

En .wasm-fil henviser til alt via indeks. Når compileren har beholdt en brugerdefineret sektion name (almindeligt i debug-builds), viser Brug navne fra navnesektionen de oprindelige navne som $factorial. Ellers genererer wabt navne som $f2 eller $t0, så teksten forbliver læselig. Produktionsbuilds er ofte strippet for navne, så et minificeret modul viser kun genererede navne.

Valideringen følger WebAssembly-specifikationen: typer skal passe på operandstakken, indeks skal findes, og så videre. Et ugyldigt modul disassembleres stadig, når dets struktur kan læses, med valideringsfejlen ved siden af, hvilket hjælper, når du fejlsøger en compiler eller en håndskrevet binærfil. Funktioner efter MVP som SIMD, tråde, bulk memory, referencetyper, multi-value, tail calls, undtagelseshåndtering, memory64 og garbage collection er slået til ved læsning.

Værktøjet bruger wabt.js, JavaScript-udgaven af WebAssembly Binary Toolkit (wasm2wat). Det indlæses først, når du åbner en fil.

Ofte stillede spørgsmål

Kan jeg få den oprindelige C-, C++- eller Rust-kildekode tilbage?

Nej. WAT er en læselig form af den kompilerede binærfil, ikke en dekompiler: kildekoden, kommentarer og det meste typeinformation er væk efter kompileringen. Funktionsnavne overlever kun, hvis navnesektionen blev bevaret.

Bliver min fil uploadet?

Nej. Filen læses og disassembleres i din browser; intet sendes til en server.

Hvorfor siger værktøjet, at filen ikke er en WebAssembly-binærfil?

Hvert modul begynder med de fire bytes \0asm efterfulgt af version 1. En fil, der leveres med andet indhold, er komprimeret med gzip eller Brotli, eller en WebAssembly-komponent (den nyere komponentmodel), bliver afvist.

Hvorfor er tekstfeltet afkortet?

Meget store moduler kan give millioner af linjer. Tekstfeltet viser den første del, så siden bliver ved med at reagere; Download .wat gemmer hele teksten.

Kan jeg køre eller teste modulet her?

Nej. Modulet instantieres bevidst aldrig, så dets kode ikke kan køre på siden. Du kan teste det ved at indlæse det i dit eget projekt eller en runtime som wasmtime eller Node.js.