Skip to content

Non-streaming WebAssembly APIs are not intercepted breaking symbolication #19564

@limbonaut

Description

@limbonaut

Is there an existing issue for this?

How do you use Sentry?

Sentry Saas (sentry.io)

Which SDK are you using?

@sentry/wasm

SDK Version

2b79e29

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

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. This bug was discovered during development.

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.

Metadata

Metadata

Assignees

Labels

Projects

Status

No status

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions