Skip to content

Commit 7fdf0c8

Browse files
committed
Add documentation for native wasm modules debugging
Signed-off-by: Doru Blânzeanu <dblnz@pm.me>
1 parent d581d7d commit 7fdf0c8

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed

docs/wasm-modules-debugging.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# Debugging WebAssembly Modules
2+
3+
This guide provides an overview of the methods and tools available for debugging native Wasm modules in the Hyperlight-Wasm environment. Effective debugging is crucial for identifying and resolving issues in Wasm modules, ensuring they function correctly within the host application.
4+
5+
## Building with Debug Information
6+
7+
To facilitate debugging, it is recommended to compile your Wasm modules with debug information included. This can be achieved by using the appropriate flags during the compilation process.
8+
For example, when using `wasi-sdk/clang`, you can include the `-g` flag to generate debug information and `-O0` to disable optimizations.
9+
You can find examples of native Wasm modules in the repository under the `rust_wasm_samples`, `wasm_samples` and `component_sample` directories.
10+
11+
Next, ensure that the pre-compiled Wasm modules are built with debug information as well. To do this, you can use the `hyperlight-wasm-aot` tool with the `--features gdb` flag:
12+
13+
```bash
14+
cargo run --features gdb -p hyperlight-wasm-aot compile input.wasm output.aot
15+
```
16+
17+
18+
## Example of debugging a Wasm Module
19+
We have a simple example of debugging a Wasm module in the [examples/guest-debugging](../src/hyperlight_wasm/examples/guest-debugging) directory.
20+
21+
This example demonstrates how to configure a Hyperlight Sandbox to enable debugging support for a Wasm module.
22+
23+
When running the example, it starts a GDB server on `localhost:8080`, allowing you to connect your debugger to this address.
24+
It hangs waiting for a debugger to attach before proceeding with the execution.
25+
You can use either GDB or LLDB to attach to the running process.
26+
You can find a sample `launch.json` configuration for Visual Studio Code that sets up remote debugging for the Wasm module using both GDB and LLDB at [VSCode launch.json Configuration](#vscode-launchjson-configuration).
27+
28+
The json configuration asks for the path to the guest binary to debug, which you see printed as a `cargo:warning` when `hyperlight-wasm`, with `gdb` feature enabled, is built.
29+
After you attach, you can set breakpoints, step through the code, and inspect variables in your wasm module as you would with any native application.
30+
31+
**NOTE**: The debugger stops at the entry point of the guest binary, which is the `hyperlight-wasm` runtime in this case, so you may need to set additional breakpoints in your Wasm module code to effectively debug it.
32+
33+
### Visual Studio Code `launch.json` Configuration
34+
35+
```json
36+
37+
{
38+
"inputs": [
39+
{
40+
"id": "program",
41+
"type": "promptString",
42+
"default": "x64/debug/wasm_runtime",
43+
"description": "Path to the program to debug"
44+
},
45+
],
46+
"configurations": [
47+
{
48+
"name": "Remote GDB attach",
49+
"type": "cppdbg",
50+
"request": "launch",
51+
"program": "${input:program}",
52+
"args": [],
53+
"stopAtEntry": true,
54+
"hardwareBreakpoints": {
55+
"require": false,
56+
"limit": 4
57+
},
58+
"cwd": "${workspaceFolder}",
59+
"environment": [],
60+
"externalConsole": false,
61+
"MIMode": "gdb",
62+
"miDebuggerPath": "/usr/bin/gdb",
63+
"miDebuggerServerAddress": "localhost:8080",
64+
"setupCommands": [
65+
{
66+
"description": "Enable pretty-printing for gdb",
67+
"text": "-enable-pretty-printing",
68+
"ignoreFailures": true
69+
},
70+
{
71+
"description": "Set Disassembly Flavor to Intel",
72+
"text": "-gdb-set disassembly-flavor intel",
73+
"ignoreFailures": true
74+
}
75+
]
76+
},
77+
{
78+
"name": "Remote LLDB attach",
79+
"type": "lldb",
80+
"request": "launch",
81+
"targetCreateCommands": [
82+
"target create ${input:program}"
83+
],
84+
"processCreateCommands": [
85+
"gdb-remote localhost:8080"
86+
]
87+
},
88+
]
89+
}
90+
```

0 commit comments

Comments
 (0)