getsentry / getsentry/sentry-javascript
Non-streaming WebAssembly APIs are not intercepted breaking symbolication
- Dominant language
- TypeScript
- Stars
- 8.7k
- Forks
- 1.8k
- Avg merge
- 1d 17h
- Merged PRs (30d)
- 515
Description
### Is there an existing issue for this?
- [x] I have checked for existing issues https://github.com/getsentry/sentry-javascript/issues
- [x] I have reviewed the documentation https://docs.sentry.io/
- [x] I am using the latest SDK release https://github.com/getsentry/sentry-javascript/releases
### How do you use Sentry?
Sentry Saas (sentry.io)
### Which SDK are you using?
@sentry/wasm
### SDK Version
2b79e29a86a83b6d99ce67934461d33dbffbc7db
### Framework Version
N/A (plain browser JS + Emscripten WASM)
### Link to Sentry event
https://sentry-sdks.sentry.io/issues/7296298931/events/86fe929d3bd942dea18b2536af515eb3/
### Reproduction Example/SDK Setup
Minimal reproduction project attached as ZIP (see README):
[wasm-symbolication.zip](https://github.com/user-attachments/files/25603295/wasm-symbolication.zip)
```javascript
Sentry.init({
dsn: __YOUR_DSN__,
debug: true,
integrations: [Sentry.wasmIntegration()],
});
// Non-streaming load (broken)
fetch("crash.wasm")
.then(function (r) { return r.arrayBuffer(); })
.then(function (buf) { return WebAssembly.instantiate(buf); })
.then(function (result) {
result.instance.exports.divide(1, 0); // triggers RuntimeError
});
```
### Steps to Reproduce
1. Build the repro: `npm run build` (compiles C to WASM with `build_id` via Emscripten)
2. Upload symbols: `npm run upload:symbols` (uploads WASM debug files + JS source maps)
3. Serve: `npm run dev`
4. Open `/index.html` (non-streaming load) and click "Divide by zero"
5. Compare with `/streaming.html` (streaming load) — same button, same WASM
### Expected Result
Both loading methods should produce an event with `debug_meta.images` containing the WASM module, allowing Sentry to symbolicate the stack frame (resolve to `crash.c:5`, function `divide`).
### Actual Result
**Streaming (`/streaming.html`) works:**
- `debug_meta.images` contains the WASM image with correct `code_id`, `debug_file`
- Frame symbolicated to `crash.c:5` with `addr_mode=rel:0`
**Non-streaming (`/index.html`) is BROKEN:**
- `debug_meta` is completely absent from the event
- WASM frame has `platform=native` and `instruction_addr` but no `addr_mode`
- No symbolication occurs despite symbols being uploaded
### Additional Context
We are adding support for Web platform in [Sentry for Godot Engine](https://github.com/getsentry/sentry-godot). This bug was discovered during development.
- https://github.com/getsentry/sentry-godot/issues/516
The SDK only patches `WebAssembly.instantiateStreaming()` and `WebAssembly.compileStreaming()`. Non-streaming APIs (`instantiate(buffer)`, `compile()`, `new Module()`) are never intercepted, so modules loaded through them are never registered in the image registry.
This affects any runtime using non-streaming loading, including Emscripten's dynamic library loader (used by Godot Engine, GDExtensions, side modules, etc).
### Priority
React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding `+1` or `me too`, to help us triage it.
Contributor guide
Assessment
This issue has not been assessed yet.