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