getsentry / getsentry/sentry-javascript

Non-streaming WebAssembly APIs are not intercepted breaking symbolication

Open
#19,564 4 comments 1 reaction 0 assignees View on GitHub
Bug WASM
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.