getsentry / getsentry/sentry-javascript

Non-streaming WebAssembly APIs are not intercepted breaking symbolication

Đang mở
#19,564 4 bình luận 1 reaction 0 người được giao Xem trên GitHub
Bug WASM
Ngôn ngữ chính
TypeScript
Star
8.7k
Fork
1.8k
Merge trung bình
1 ngày 17 giờ
Pull request đã merge (30 ngày)
515

Mô tả

### 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.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.