add basic coredump generation (#5868)

This change adds a basic coredump generation after a WebAssembly trap
was entered. The coredump includes rudimentary stack / process debugging
information.

A new CLI argument is added to enable coredump generation:
```
wasmtime --coredump-on-trap=/path/to/coredump/file module.wasm
```

See ./docs/examples-coredump.md for a working example.

Refs https://github.com/bytecodealliance/wasmtime/issues/5732
This commit is contained in:
Sven Sauleau
2023-02-28 20:27:52 +00:00
committed by GitHub
parent 2dd6064005
commit 0e9a48afd5
4 changed files with 162 additions and 2 deletions

62
docs/examples-coredump.md Normal file
View File

@@ -0,0 +1,62 @@
# Using Wasm coredump
The following steps describe how to debug using Wasm coredump in Wasmtime:
1. Compile your WebAssembly with debug info enabled; for example:
```sh
$ rustc foo.rs --target=wasm32-wasi -C debuginfo=2
```
<details>
<summary>foo.rs</summary>
fn c(v: usize) {
a(v - 3);
}
fn b(v: usize) {
c(v - 3);
}
fn a(v: usize) {
b(v - 3);
}
pub fn main() {
a(10);
}
</details>
2. Run with Wasmtime and Wasm coredump enabled:
```sh
$ wasmtime --coredump-on-trap=/tmp/coredump foo.wasm
thread 'main' panicked at 'attempt to subtract with overflow', foo.rs:10:7
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Error: failed to run main module `foo.wasm`
Caused by:
0: Core dumped at /tmp/coredump
1: failed to invoke command default
2: error while executing at wasm backtrace:
...
```
3. Use [wasmgdb] to debug:
```sh
$ wasmgdb foo.wasm /tmp/coredump
wasmgdb> bt
...
#13 000175 as panic () at library/core/src/panicking.rs
#12 000010 as a (v=???) at /path/to/foo.rs
#11 000009 as c (v=???) at /path/to/foo.rs
#10 000011 as b (v=???) at /path/to/foo.rs
#9 000010 as a (v=???) at /path/to/foo.rs
#8 000012 as main () at /path/to/foo.rs
...
```
[wasmgdb]: https://crates.io/crates/wasmgdb