15c1557d2SNick Fitzgerald# Debugging with `gdb` and `lldb`
25c1557d2SNick Fitzgerald
35c1557d2SNick FitzgeraldThe following steps describe how to use `gdb` or `lldb` to debug both the Wasm
45c1557d2SNick Fitzgeraldguest and the host (i.e. the Wasmtime CLI or your Wasmtime-embedding program) at
55c1557d2SNick Fitzgeraldthe same time:
65c1557d2SNick Fitzgerald
75c1557d2SNick Fitzgerald1. Compile your WebAssembly with debug info enabled, usually `-g`; for
85c1557d2SNick Fitzgerald   example:
95c1557d2SNick Fitzgerald
1092cfda1bSVictor Adossi    ```console
115c1557d2SNick Fitzgerald    clang foo.c -g -o foo.wasm
125c1557d2SNick Fitzgerald    ```
135c1557d2SNick Fitzgerald
145c1557d2SNick Fitzgerald2. Run Wasmtime with the debug info enabled; this is `-D debug-info` from the
155c1557d2SNick Fitzgerald   CLI and `Config::debug_info(true)` in an embedding (e.g. see [debugging in a
16*ac3358b1SChris Fallin   Rust embedding](./examples-debugging.md)). It's also recommended to use
1796c905a6SAlex Crichton   `-O opt-level=0` for better inspection of local variables if desired.
185c1557d2SNick Fitzgerald
195c1557d2SNick Fitzgerald3. Use a supported debugger:
205c1557d2SNick Fitzgerald
2192cfda1bSVictor Adossi    ```console
225c1557d2SNick Fitzgerald    lldb -- wasmtime run -D debug-info foo.wasm
235c1557d2SNick Fitzgerald    ```
2492cfda1bSVictor Adossi    ```console
2596c905a6SAlex Crichton    gdb --args wasmtime run -D debug-info -O opt-level=0 foo.wasm
265c1557d2SNick Fitzgerald    ```
275c1557d2SNick Fitzgerald
285c1557d2SNick FitzgeraldIf you run into trouble, the following discussions might help:
295c1557d2SNick Fitzgerald
305c1557d2SNick Fitzgerald- On MacOS with LLDB you may need to run: `settings set
315c1557d2SNick Fitzgerald  plugin.jit-loader.gdb.enable on`
325c1557d2SNick Fitzgerald  ([#1953](https://github.com/bytecodealliance/wasmtime/issues/1953))
335c1557d2SNick Fitzgerald
345c1557d2SNick Fitzgerald- With LLDB, call `__vmctx.set()` to set the current context before calling any
355c1557d2SNick Fitzgerald  dereference operators
365c1557d2SNick Fitzgerald  ([#1482](https://github.com/bytecodealliance/wasmtime/issues/1482)):
3792cfda1bSVictor Adossi  ```text
385c1557d2SNick Fitzgerald  (lldb) p __vmctx->set()
395c1557d2SNick Fitzgerald  (lldb) p *foo
405c1557d2SNick Fitzgerald  ```
415c1557d2SNick Fitzgerald
425c1557d2SNick Fitzgerald- The address of the start of instance memory can be found in `__vmctx->memory`
435c1557d2SNick Fitzgerald
445c1557d2SNick Fitzgerald- On Windows you may experience degraded WASM compilation throughput due to the
455c1557d2SNick Fitzgerald  enablement of additional native heap checks when under the debugger by default.
465c1557d2SNick Fitzgerald  You can set the environment variable `_NO_DEBUG_HEAP` to `1` to disable them.
47