WasmBacktrace in wasmtime - Rust (original) (raw)
Struct WasmBacktrace
pub struct WasmBacktrace { /* private fields */ }
Available on crate feature runtime
only.
Expand description
Representation of a backtrace of function frames in a WebAssembly module for where an error happened.
This structure is attached to the anyhow::Error returned from many Wasmtime functions that execute WebAssembly such as Instance::new orFunc::call. This can be acquired with the anyhow::Error::downcastfamily of methods to programmatically inspect the backtrace. Otherwise since it’s part of the error returned this will get printed along with the rest of the error when the error is logged.
Capturing of wasm backtraces can be configured through theConfig::wasm_backtrace method.
For more information about errors in wasmtime see the documentation of theTrap type.
§Examples
let engine = Engine::default();
let module = Module::new(
&engine,
r#"
(module
(func $start (export "run")
call $trap)
(func $trap
unreachable)
)
"#,
)?;
let mut store = Store::new(&engine, ());
let instance = Instance::new(&mut store, &module, &[])?;
let func = instance.get_typed_func::<(), ()>(&mut store, "run")?;
let error = func.call(&mut store, ()).unwrap_err();
let bt = error.downcast_ref::<WasmBacktrace>().unwrap();
let frames = bt.frames();
assert_eq!(frames.len(), 2);
assert_eq!(frames[0].func_name(), Some("trap"));
assert_eq!(frames[1].func_name(), Some("start"));
Captures a trace of the WebAssembly frames on the stack for the provided store.
This will return a WasmBacktrace which holds capturedFrameInfos for each frame of WebAssembly on the call stack of the current thread. If no WebAssembly is on the stack then the returned backtrace will have no frames in it.
Note that this function will respect the Config::wasm_backtraceconfiguration option and will return an empty backtrace if that is disabled. To always capture a backtrace use theWasmBacktrace::force_capture method.
Also note that this function will only capture frames from the specified store
on the stack, ignoring frames from other stores if present.
§Example
let engine = Engine::default();
let module = Module::new(
&engine,
r#"
(module
(import "" "" (func $host))
(func <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>o</mi><mi>o</mi><mo stretchy="false">(</mo><mi>e</mi><mi>x</mi><mi>p</mi><mi>o</mi><mi>r</mi><mi>t</mi><mi mathvariant="normal">"</mi><mi>f</mi><mi mathvariant="normal">"</mi><mo stretchy="false">)</mo><mi>c</mi><mi>a</mi><mi>l</mi><mi>l</mi></mrow><annotation encoding="application/x-tex">foo (export "f") call </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">oo</span><span class="mopen">(</span><span class="mord mathnormal">e</span><span class="mord mathnormal">x</span><span class="mord mathnormal">p</span><span class="mord mathnormal" style="margin-right:0.02778em;">or</span><span class="mord mathnormal">t</span><span class="mord">"</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord">"</span><span class="mclose">)</span><span class="mord mathnormal">c</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em;">ll</span></span></span></span>bar)
(func <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mi>a</mi><mi>r</mi><mi>c</mi><mi>a</mi><mi>l</mi><mi>l</mi></mrow><annotation encoding="application/x-tex">bar call </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">ba</span><span class="mord mathnormal">rc</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em;">ll</span></span></span></span>host)
)
"#,
)?;
let mut store = Store::new(&engine, ());
let func = Func::wrap(&mut store, |cx: Caller<'_, ()>| {
let trace = WasmBacktrace::capture(&cx);
println!("{trace:?}");
});
let instance = Instance::new(&mut store, &module, &[func.into()])?;
let func = instance.get_typed_func::<(), ()>(&mut store, "f")?;
func.call(&mut store, ())?;
Unconditionally captures a trace of the WebAssembly frames on the stack for the provided store.
Same as WasmBacktrace::capture except that it disregards theConfig::wasm_backtrace setting and always captures a backtrace.
Returns a list of function frames in WebAssembly this backtrace represents.