15c1557d2SNick Fitzgerald# Debugging WebAssembly with Core Dumps
25c1557d2SNick Fitzgerald
35c1557d2SNick FitzgeraldWasmtime can be configured to generate [the standard Wasm core dump
45c1557d2SNick Fitzgeraldformat][spec] whenever guest Wasm programs trap. These core dumps can then be
55c1557d2SNick Fitzgeraldconsumed by external tooling (such as [`wasmgdb`][wasmgdb]) for post-mortem analysis.
65c1557d2SNick Fitzgerald
75c1557d2SNick FitzgeraldThis page focuses on generating and inspecting core dumps via the Wasmtime
85c1557d2SNick Fitzgeraldcommand-line interface. For details on how to generate core dumps via the
95c1557d2SNick Fitzgerald`wasmtime` embedding API, see [Core Dumps in a Rust
10*ac3358b1SChris FallinEmbedding](./examples-core-dumps.md).
115c1557d2SNick Fitzgerald
125c1557d2SNick FitzgeraldFirst, we need to compile some code to Wasm that can trap. Consider the
135c1557d2SNick Fitzgeraldfollowing Rust code:
145c1557d2SNick Fitzgerald
155c1557d2SNick Fitzgerald```rust,no_run
165c1557d2SNick Fitzgerald// trap.rs
175c1557d2SNick Fitzgerald
185c1557d2SNick Fitzgeraldfn main() {
195c1557d2SNick Fitzgerald    foo(42);
205c1557d2SNick Fitzgerald}
215c1557d2SNick Fitzgerald
225c1557d2SNick Fitzgeraldfn foo(x: u32) {
235c1557d2SNick Fitzgerald    bar(x);
245c1557d2SNick Fitzgerald}
255c1557d2SNick Fitzgerald
265c1557d2SNick Fitzgeraldfn bar(x: u32) {
275c1557d2SNick Fitzgerald    baz(x);
285c1557d2SNick Fitzgerald}
295c1557d2SNick Fitzgerald
305c1557d2SNick Fitzgeraldfn baz(x: u32) {
315c1557d2SNick Fitzgerald    assert!(x != 42);
325c1557d2SNick Fitzgerald}
335c1557d2SNick Fitzgerald```
345c1557d2SNick Fitzgerald
355c1557d2SNick FitzgeraldWe can compile it to Wasm with the following command:
365c1557d2SNick Fitzgerald
3792cfda1bSVictor Adossi```console
3892cfda1bSVictor Adossirustc --target wasm32-wasip1 -o ./trap.wasm ./trap.rs
395c1557d2SNick Fitzgerald```
405c1557d2SNick Fitzgerald
415c1557d2SNick FitzgeraldNext, we can run it in Wasmtime and capture a core dump when it traps:
425c1557d2SNick Fitzgerald
435c1557d2SNick Fitzgerald```shell-session
445c1557d2SNick Fitzgerald$ wasmtime -D coredump=./trap.coredump ./trap.wasm
455c1557d2SNick Fitzgeraldthread 'main' panicked at /home/nick/scratch/trap.rs:14:5:
465c1557d2SNick Fitzgeraldassertion failed: x != 42
475c1557d2SNick Fitzgeraldnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
485c1557d2SNick FitzgeraldError: failed to run main module `/home/nick/scratch/trap.wasm`
495c1557d2SNick Fitzgerald
505c1557d2SNick FitzgeraldCaused by:
515c1557d2SNick Fitzgerald    0: core dumped at /home/nick/scratch/trap.coredump
525c1557d2SNick Fitzgerald    1: failed to invoke command default
535c1557d2SNick Fitzgerald    2: wasm coredump generated while executing store_name:
545c1557d2SNick Fitzgerald       modules:
555c1557d2SNick Fitzgerald         <module>
565c1557d2SNick Fitzgerald       instances:
575c1557d2SNick Fitzgerald         Instance(store=1, index=1)
585c1557d2SNick Fitzgerald       memories:
595c1557d2SNick Fitzgerald         Memory(store=1, index=1)
605c1557d2SNick Fitzgerald       globals:
615c1557d2SNick Fitzgerald         Global(store=1, index=0)
625c1557d2SNick Fitzgerald       backtrace:
635c1557d2SNick Fitzgerald       error while executing at wasm backtrace:
645c1557d2SNick Fitzgerald           0: 0x5961 - <unknown>!__rust_start_panic
655c1557d2SNick Fitzgerald           1: 0x562a - <unknown>!rust_panic
665c1557d2SNick Fitzgerald           2: 0x555d - <unknown>!std::panicking::rust_panic_with_hook::h58e7d0b3d70e95b6
675c1557d2SNick Fitzgerald           3: 0x485d - <unknown>!std::panicking::begin_panic_handler::{{closure}}::h1853004619879cfd
685c1557d2SNick Fitzgerald           4: 0x47bd - <unknown>!std::sys_common::backtrace::__rust_end_short_backtrace::hed32bc5557405634
695c1557d2SNick Fitzgerald           5: 0x4f02 - <unknown>!rust_begin_unwind
705c1557d2SNick Fitzgerald           6: 0xac01 - <unknown>!core::panicking::panic_fmt::h53ca5bf48b428895
715c1557d2SNick Fitzgerald           7: 0xb1c5 - <unknown>!core::panicking::panic::h62c2c2bb054da7e1
725c1557d2SNick Fitzgerald           8:  0x661 - <unknown>!trap::baz::h859f39b65389c077
735c1557d2SNick Fitzgerald           9:  0x616 - <unknown>!trap::bar::h7ad12f9c5b730d17
745c1557d2SNick Fitzgerald          10:  0x60a - <unknown>!trap::foo::ha69c95723611c1a0
755c1557d2SNick Fitzgerald          11:  0x5fe - <unknown>!trap::main::hdfcd9f2d150fc3dc
765c1557d2SNick Fitzgerald          12:  0x434 - <unknown>!core::ops::function::FnOnce::call_once::h24336e950fb97d1e
775c1557d2SNick Fitzgerald          13:  0x40b - <unknown>!std::sys_common::backtrace::__rust_begin_short_backtrace::h2b37384d2b1a57ff
785c1557d2SNick Fitzgerald          14:  0x4ec - <unknown>!std::rt::lang_start::{{closure}}::he86eb1b6ac6d7501
795c1557d2SNick Fitzgerald          15: 0x24f7 - <unknown>!std::rt::lang_start_internal::h21f6a1d8f3633b54
805c1557d2SNick Fitzgerald          16:  0x497 - <unknown>!std::rt::lang_start::h7d256f21902ff32b
815c1557d2SNick Fitzgerald          17:  0x687 - <unknown>!__main_void
825c1557d2SNick Fitzgerald          18:  0x3e6 - <unknown>!_start
835c1557d2SNick Fitzgerald       note: using the `WASMTIME_BACKTRACE_DETAILS=1` environment variable may show more debugging information
845c1557d2SNick Fitzgerald```
855c1557d2SNick Fitzgerald
865c1557d2SNick FitzgeraldYou now have a core dump at `./trap.coredump` that can be consumed by external
875c1557d2SNick Fitzgeraldtooling to do post-mortem analysis of the failure.
885c1557d2SNick Fitzgerald
895c1557d2SNick Fitzgerald[spec]: https://github.com/WebAssembly/tool-conventions/blob/main/Coredump.md
905c1557d2SNick Fitzgerald[wasmgdb]: https://github.com/xtuc/wasm-coredump/blob/main/bin/wasmgdb/README.md
91