Awesome WebAssembly Tools
A collection of useful, language-agnostic WebAssembly development tools.
Inspecting
-
WebAssembly Code Explorer | online tool
A simple binary explorer with neat binary code highlighting. -
wasm-opt | part of
Binaryen
- Color output of s-expression format:
wasm-opt --print test.wasm
- Plot the callgraph using
Graphviz
:
wasm-opt --print-call-graph test.wasm | dot -Tpng -o callgraph.png
- Dump DWARF debug info sections:
wasm-opt --dwarfdump test.wasm
- Print function metrics:
wasm-opt --func-metrics test.wasm
- Color output of s-expression format:
-
wasm-decompile | part of
WABT
, article
wasm-decompile
decompiles a wasm binary into readable code. It generates output that tries to look like a "very average programming language" while still staying close to the wasm it represents. -
wasmdec | repo, online tool
Converts WebAssembly binaries to C. Similar towasm2c
. -
wasp | repo
Generate callgraphs, CFG and DFG graphs for wasm functions. -
wasm-objdump | part of
WABT
Print low-level details about a.wasm
binary and each of its sections. -
wasm-nm | repo
List the imported, exported, and private function symbols defined within a.wasm
binary.
Static analysis
-
Twiggy | repo
Code size profiler, analyzes a binary's call graph. -
Manticore | repo, article
Symbolic execution of WebAssembly binaries. -
Octopus | repo
Security analysis framework for WebAssembly modules and Smart Contracts. -
Wassail | repo
A toolkit to perform both lightweight and heavyweight static analysis of WebAssembly modules. -
wasm-opcodecnt | part of
WABT
Count wasm opcode usage statistics.
Manipulating (optimization, transformation, instrumentation)
-
wasm-opt | part of
Binaryen
- Transform binary for asynchronous execution (read more in this article):
wasm-opt test.wasm --asyncify -O3 -o asyncified.wasm
- Instrument binary for dynamic execution tracing:
wasm-opt test.wasm --instrument-memory --instrument-locals --log-execution -o instrumetred.wasm
- Transform binary for asynchronous execution (read more in this article):
-
wizer | repo
Don't wait for your Wasm module to initialize itself, pre-initialize it! Wizer instantiates your WebAssembly module, executes its initialization function, and then snapshots the initialized state out into a new WebAssembly module. -
wasm2c | part of
WABT
, article 1, article 2
Takes a WebAssembly module and produces an equivalent (and runnable) C source and header. -
wasm-snip | repo
Replaces a WebAssembly function's body with anunreachable
. -
wasmonkey | repo
Magically turns exported WASM functions into imported functions. -
wasm-meter | npm, repo
Injects metering into webassembly binaries. This counts computation time for a given program in units ofgas
(and allows limiting it). -
CROW | repo
The Wasm superdiversifier. It takes C source code or LLVM bitcode as input and generates several functionally equivalent, but diverse Wasm binaries.
Dynamic analysis (tracing, profiling)
-
wasm3-strace | wapm, repo
Structured, seamless tracing of arbitrary WebAssembly/WASI execution. -
Wasabi | home, repo
"WebAssembly analysis using binary instrumentation", a dynamic analysis framework. -
wasmsign | repo
A tool to add and verify digital signatures to/from WASM binaries. -
swam | repo
A WASM interpreter with advanced tracing capabilities.
Source-level debugging
-
Chrome DevTools | article
-
LLDB | article
-
wasminspect | repo
An interactive and self-contained debugger for WebAssembly/WASI.
Tool development
-
Tool Conventions | docs
Documents describing conventions useful for coordinating interoperability between wasm-related tools. -
wasm2json, json2wasm | npm, repo
A small toolkit for converting wasm binaries into json and back. Incredibly helpful for experimenting and creating your own transformations. -
walrus | repo
Rust library for performing WebAssembly transformations in a robust and ergonomic fashion. -
wasp | repo
C++ library designed to make it easy to work with WebAssembly modules. -
Binaryen.js | repo
A port of Binaryen to the Web, allowing you to generate WebAssembly using JavaScript. -
wasm-tools | repo
Rust tooling for low-level manipulation of WebAssembly modules.
wasm-smith
test case generator is of particular interest.
wasm-shrink
shrinks a Wasm file while preserving an interesting property (such as triggering a bug). -
wasm-debug | repo, crate
A runtime-independent Rust library that provides functionality to read, transform, and write DWARF section. -
witx-codegen | repo
A code generator to access WebAssembly standard APIs from different programming languages. Can also generate documentation. -
Articles
Other
-
WebAssembly Opcode Table | docs
-
Webassembly.sh | online tool