Utilia

WebAssembly disasembler

Pretvori .wasm binarni fajl u čitljiv WAT tekst, proveri ga i izlistaj odeljke, uvoze, izvoze i funkcije, u pregledaču, bez pokretanja modula.

Modul se samo čita i pretvara u tekst: nikada se ne kompajlira, ne instancira i ne pokreće.

Kako se WASM pretvara u WAT

  1. Prevuci .wasm fajl na zonu za otpuštanje ili klikni na nju da izabereš fajl (do 20 MB). Možeš i da pritisneš Učitaj primer modula da vidiš mali demo.
  2. Alat proverava binarni fajl, validira ga i prikazuje rezultat: ✓ Modul je ispravan. ili razlog zašto nije.
  3. Pročitaj brojače: Funkcije (uvezene i definisane), Uvozi, Izvozi, Tipovi, Memorije, Tabele i Globalne promenljive.
  4. Pročitaj disasembliranje u Tekstualni format WebAssembly-ja (WAT), pa ga Kopiraj ili pritisni Preuzmi .wat.
  5. Podesi izlaz opcijama: Koristi imena iz odeljka name, Savijeni izrazi (S-izrazi) i Izvozi u liniji.
  6. Otvori tabele Odeljci, Uvozi i Izvozi za raspored fajla: svaki odeljak sa svojim pomakom u bajtovima, veličinom i brojem stavki.

Modul se nikada ne kompajlira, ne instancira i ne pokreće. Alat samo čita njegove bajtove i pretvara ih u tekst, pa je bezbedno pregledati fajl kojem ne veruješ.

Šta pokazuje WAT izlaz

WebAssembly ima dva ekvivalentna formata: kompaktni binarni .wasm koji učitavaju pregledači i okruženja za izvršavanje, i tekstualni format .wat, namenjen ljudima. Disasembler ispisuje svaki deo modula u tekstualnom obliku: tipove funkcija, uvoze, tela funkcija, tabele, memorije, globalne promenljive, izvoze, startnu funkciju, segmente elemenata i segmente podataka.

Podrazumevano, instrukcije se navode jedna po redu u redosledu steka, onako kako su sačuvane:

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

Sa Savijeni izrazi (S-izrazi), operandi su ugnežđeni unutar instrukcije koja ih koristi, kao u (i32.add (local.get $a) (local.get $b)), što je često lakše pratiti. Izvozi u liniji piše (export "add") unutar funkcije umesto u posebnoj listi.

Imena, informacije za otklanjanje grešaka i validacija

Fajl .wasm sve navodi po indeksu. Kada je kompajler zadržao prilagođeni odeljak name (uobičajeno u debug izgradnjama), Koristi imena iz odeljka name prikazuje izvorna imena kao $factorial. U suprotnom wabt pravi imena kao $f2 ili $t0 da tekst ostane čitljiv. Produkcione izgradnje često su lišene imena, pa će minifikovani modul prikazati samo generisana imena.

Validacija prati WebAssembly specifikaciju: tipovi moraju da se poklapaju na steku operanada, indeksi moraju da postoje i tako dalje. Neispravan modul se i dalje disasemblira kada se njegova struktura može pročitati, uz grešku validacije pored, što pomaže pri otklanjanju grešaka u kompajleru ili ručno napisanom binarnom fajlu. Mogućnosti posle MVP-a kao SIMD, niti, grupne operacije nad memorijom, tipovi referenci, više vrednosti, repni pozivi, obrada izuzetaka, memory64 i sakupljanje otpada omogućene su za čitanje.

Ovaj alat koristi wabt.js, JavaScript izgradnju WebAssembly Binary Toolkit-a (wasm2wat). Učitava se tek kada otvoriš fajl.

Česta pitanja

Mogu li da povratim originalni C, C++ ili Rust izvorni kod?

Ne. WAT je čitljiv oblik kompajliranog binarnog fajla, a ne dekompajler: izvorni kod, komentari i većina informacija o tipovima nestaju posle kompajliranja. Imena funkcija preživljavaju samo ako je odeljak name zadržan.

Da li se moj fajl otprema?

Ne. Fajl se čita i disasemblira u tvom pregledaču; ništa se ne šalje serveru.

Zašto alat kaže da fajl nije WebAssembly binarni fajl?

Svaki modul počinje sa četiri bajta \0asm, iza kojih sledi verzija 1. Fajl sa drugačijim sadržajem, kompresovan sa gzip ili Brotli, ili WebAssembly komponenta (noviji model komponenti) biće odbijen.

Zašto je tekstualno polje odsečeno?

Veoma veliki moduli mogu da daju milione redova. Tekstualno polje prikazuje prvi deo da stranica ostane responzivna; Preuzmi .wat čuva kompletan tekst.

Mogu li ovde da pokrenem ili testiram modul?

Ne. Modul se namerno nikada ne instancira, pa se njegov kod ne može izvršiti na stranici. Da ga testiraš, učitaj ga u sopstveni projekat ili okruženje kao što je wasmtime ili Node.js.