-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Wasm integration doesn't work for uncaught WebAssembly.Exception #13787
Comments
Hey 👋 diff --git a/node_modules/@sentry/browser/build/npm/cjs/eventbuilder.js b/node_modules/@sentry/browser/build/npm/cjs/eventbuilder.js
index d6a2a81..d099c2e 100644
--- a/node_modules/@sentry/browser/build/npm/cjs/eventbuilder.js
+++ b/node_modules/@sentry/browser/build/npm/cjs/eventbuilder.js
@@ -10,7 +10,10 @@ function exceptionFromError(stackParser, ex) {
// Get the frames first since Opera can lose the stack if we touch anything else first
const frames = parseStackFrames(stackParser, ex);
- const exception = {
+ const exception = ex instanceof WebAssembly.Exception ? {
+ type: ex.message[0],
+ value: ex.message[ex.message.length - 1],
+ } : {
type: ex && ex.name,
value: extractMessage(ex),
};
diff --git a/node_modules/@sentry/browser/build/npm/esm/eventbuilder.js b/node_modules/@sentry/browser/build/npm/esm/eventbuilder.js
index dda7161..cbafc04 100644
--- a/node_modules/@sentry/browser/build/npm/esm/eventbuilder.js
+++ b/node_modules/@sentry/browser/build/npm/esm/eventbuilder.js
@@ -8,7 +8,10 @@ function exceptionFromError(stackParser, ex) {
// Get the frames first since Opera can lose the stack if we touch anything else first
const frames = parseStackFrames(stackParser, ex);
- const exception = {
+ const exception = ex instanceof WebAssembly.Exception ? {
+ type: ex.message[0],
+ value: ex.message[ex.message.length - 1],
+ } : {
type: ex && ex.name,
value: extractMessage(ex),
}; diff --git a/node_modules/@sentry/utils/build/cjs/is.js b/node_modules/@sentry/utils/build/cjs/is.js
index 956b1fb..33e8ddf 100644
--- a/node_modules/@sentry/utils/build/cjs/is.js
+++ b/node_modules/@sentry/utils/build/cjs/is.js
@@ -15,6 +15,7 @@ function isError(wat) {
case '[object Error]':
case '[object Exception]':
case '[object DOMException]':
+ case '[object WebAssembly.Exception]':
return true;
default:
return isInstanceOf(wat, Error);
diff --git a/node_modules/@sentry/utils/build/esm/is.js b/node_modules/@sentry/utils/build/esm/is.js
index 32b6f6a..c661ea2 100644
--- a/node_modules/@sentry/utils/build/esm/is.js
+++ b/node_modules/@sentry/utils/build/esm/is.js
@@ -13,6 +13,7 @@ function isError(wat) {
case '[object Error]':
case '[object Exception]':
case '[object DOMException]':
+ case '[object WebAssembly.Exception]':
return true;
default:
return isInstanceOf(wat, Error); |
Hi @kurrak thanks for reporting! I think you're on the right track with your suspicion. Also @trzeciak thanks for taking a look! Your solution looks very reasonable to me! Are you interested in submitting a PR for this? Happy to review :) Otherwise, no worries, just let me know and we'll pick it up. Full disclosure: Our WASM integration hasn't seen much love in the last years so chances are very high that we don't cover a lot of cases. |
@Lms24 We talked about it locally and it turned out that some minor details need to be corrected, I'll try to prepare the PR over the weekend, if I don't find the time I'll let you know. Hehe, we have already encountered a few other problems with wasm and sentry (you can see it on my github activity) xD. Despite the issues I have encountered, I have always enjoyed working with sentry! 💪 |
…13854) Add support for wasm WebAssembly.Exception (uncaught exception in emscripten). ## References - [WebAssembly.Exception | MDN Web Docs](https://developer.mozilla.org/en-US/docs/WebAssembly/JavaScript_interface/Exception) - #13787 --------- Co-authored-by: s1gr1d <sigrid.huemer@posteo.at> Co-authored-by: Sigrid Huemer <32902192+s1gr1d@users.noreply.github.com> Co-authored-by: Luca Forstner <luca.forstner@sentry.io>
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@sentry/node](https://github.com/getsentry/sentry-javascript/tree/master/packages/node) ([source](https://github.com/getsentry/sentry-javascript)) | dependencies | minor | [`8.33.1` -> `8.34.0`](https://renovatebot.com/diffs/npm/@sentry%2fnode/8.33.1/8.34.0) | | [@sentry/react](https://github.com/getsentry/sentry-javascript/tree/master/packages/react) ([source](https://github.com/getsentry/sentry-javascript)) | dependencies | minor | [`8.33.1` -> `8.34.0`](https://renovatebot.com/diffs/npm/@sentry%2freact/8.33.1/8.34.0) | --- ### Release Notes <details> <summary>getsentry/sentry-javascript (@​sentry/node)</summary> ### [`v8.34.0`](https://github.com/getsentry/sentry-javascript/releases/tag/8.34.0) [Compare Source](getsentry/sentry-javascript@8.33.1...8.34.0) ##### Important Changes - **ref(nextjs): Remove dead code ([#​13828](getsentry/sentry-javascript#13903 Relevant for users of the `@sentry/nextjs` package: If you have previously configured a `SENTRY_IGNORE_API_RESOLUTION_ERROR` environment variable, it is now safe to unset it. ##### Other Changes - feat(cdn): Export `getReplay` in replay CDN bundles ([#​13881](getsentry/sentry-javascript#13881)) - feat(replay): Clear fallback buffer when switching buffers ([#​13914](getsentry/sentry-javascript#13914)) - feat(replay): Upgrade rrweb packages to 2.28.0 ([#​13732](getsentry/sentry-javascript#13732)) - fix(docs): Correct supported browsers due to `globalThis` ([#​13788](getsentry/sentry-javascript#13788)) - fix(nextjs): Adjust path to `requestAsyncStorageShim.js` template file ([#​13928](getsentry/sentry-javascript#13928)) - fix(nextjs): Detect new locations for request async storage to support Next.js v15.0.0-canary.180 and higher ([#​13920](getsentry/sentry-javascript#13920)) - fix(nextjs): Drop `_not-found` spans for all HTTP methods ([#​13906](getsentry/sentry-javascript#13906)) - fix(nextjs): Fix resolution of request storage shim fallback ([#​13929](getsentry/sentry-javascript#13929)) - fix(node): Ensure graphql options are correct when preloading ([#​13769](getsentry/sentry-javascript#13769)) - fix(node): Local variables handle error ([#​13827](getsentry/sentry-javascript#13827)) - fix(node): Remove `dataloader` instrumentation from default integrations ([#​13873](getsentry/sentry-javascript#13873)) - fix(nuxt): Create declaration files for Nuxt module ([#​13909](getsentry/sentry-javascript#13909)) - fix(replay): Ensure `replay_id` is removed from frozen DSC when stopped ([#​13893](getsentry/sentry-javascript#13893)) - fix(replay): Try/catch `sendBufferedReplayOrFlush` to prevent cycles ([#​13900](getsentry/sentry-javascript#13900)) - fix(sveltekit): Ensure trace meta tags are always injected ([#​13231](getsentry/sentry-javascript#13231)) - fix(sveltekit): Update `wrapServerRouteWithSentry` to respect ParamMatchers ([#​13390](getsentry/sentry-javascript#13390)) - fix(wasm): Integration wasm uncaught WebAssembly.Exception ([#​13787](getsentry/sentry-javascript#13787)) ([#​13854](getsentry/sentry-javascript#13854)) - ref(nextjs): Ignore sentry spans based on query param attribute ([#​13905](getsentry/sentry-javascript#13905)) - ref(utils): Move `vercelWaitUntil` to utils ([#​13891](getsentry/sentry-javascript#13891)) Work in this release was contributed by [@​trzeciak](https://github.com/trzeciak), [@​gurpreetatwal](https://github.com/gurpreetatwal), [@​ykzts](https://github.com/ykzts) and [@​lizhiyao](https://github.com/lizhiyao). Thank you for your contributions! ##### Bundle size 📦 | Path | Size | | ---------------------------------------------------------------- | ----------------- | | [@​sentry/browser](https://github.com/sentry/browser) | 22.73 KB | | [@​sentry/browser](https://github.com/sentry/browser) - with treeshaking flags | 21.53 KB | | [@​sentry/browser](https://github.com/sentry/browser) (incl. Tracing) | 34.97 KB | | [@​sentry/browser](https://github.com/sentry/browser) (incl. Tracing, Replay) | 71.62 KB | | [@​sentry/browser](https://github.com/sentry/browser) (incl. Tracing, Replay) - with treeshaking flags | 62.03 KB | | [@​sentry/browser](https://github.com/sentry/browser) (incl. Tracing, Replay with Canvas) | 75.97 KB | | [@​sentry/browser](https://github.com/sentry/browser) (incl. Tracing, Replay, Feedback) | 88.73 KB | | [@​sentry/browser](https://github.com/sentry/browser) (incl. Tracing, Replay, Feedback, metrics) | 90.59 KB | | [@​sentry/browser](https://github.com/sentry/browser) (incl. metrics) | 27 KB | | [@​sentry/browser](https://github.com/sentry/browser) (incl. Feedback) | 39.87 KB | | [@​sentry/browser](https://github.com/sentry/browser) (incl. sendFeedback) | 27.38 KB | | [@​sentry/browser](https://github.com/sentry/browser) (incl. FeedbackAsync) | 32.17 KB | | [@​sentry/react](https://github.com/sentry/react) | 25.49 KB | | [@​sentry/react](https://github.com/sentry/react) (incl. Tracing) | 37.94 KB | | [@​sentry/vue](https://github.com/sentry/vue) | 26.91 KB | | [@​sentry/vue](https://github.com/sentry/vue) (incl. Tracing) | 36.86 KB | | [@​sentry/svelte](https://github.com/sentry/svelte) | 22.87 KB | | CDN Bundle | 24.05 KB | | CDN Bundle (incl. Tracing) | 36.76 KB | | CDN Bundle (incl. Tracing, Replay) | 71.38 KB | | CDN Bundle (incl. Tracing, Replay, Feedback) | 76.7 KB | | CDN Bundle - uncompressed | 70.53 KB | | CDN Bundle (incl. Tracing) - uncompressed | 109.04 KB | | CDN Bundle (incl. Tracing, Replay) - uncompressed | 221.4 KB | | CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed | 234.62 KB | | [@​sentry/nextjs](https://github.com/sentry/nextjs) (client) | 37.91 KB | | [@​sentry/sveltekit](https://github.com/sentry/sveltekit) (client) | 35.56 KB | | [@​sentry/node](https://github.com/sentry/node) | 124.5 KB | | [@​sentry/node](https://github.com/sentry/node) - without tracing | 93.64 KB | | [@​sentry/aws-serverless](https://github.com/sentry/aws-serverless) | 103.3 KB | </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMTYuMCIsInVwZGF0ZWRJblZlciI6IjM4LjExNi4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=--> Reviewed-on: https://git.tristess.app/alexandresoro/ouca/pulls/212 Reviewed-by: Alexandre Soro <code@soro.dev> Co-authored-by: renovate <renovate@git.tristess.app> Co-committed-by: renovate <renovate@git.tristess.app>
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
8.26.0
Framework Version
No response
Link to Sentry event
https://explain-everything.sentry.io/issues/5899639997/events/6735b6aa338e4a90b997c83410c1ef92/?project=4507549500047360
Reproduction Example/SDK Setup
I wasn't able to make minimal example showcasing the problem, as I was not able to find a way to use
wasmIntegration
using loader/CDN setup (In my app I'm integrating@sentry/wasm
via npm). I'll happily update this if pointed to possible solution/workaround.In order to run the example you need to install Emscripten SDK for compiling c++ code to wasm.
index.html
:main.cpp
:Steps to Reproduce
index.html
andmain.cpp
files as listed above in the same directoryemcc -fwasm-exceptions -sEXCEPTION_STACK_TRACES=1 -Oz -g3 main.cpp -o index.js
python3 -m http.server
) and openindex.html
in the browser (http://localhost:8000 in my case).Expected Result
Reported event should be recognised as Wasm event and should have stack trace showing stack trace when exception was thrown. This would allow proper symbolication and event grouping.
Actual Result
Reported event is recognised as regular JS event and has wrong stack trace. Stack trace has only JS frames for state completely not related to wasm/c++ exception.
Note that following shows results for my real app that integrates with sentry via npm
When using DevTools to see what event is provided to
beforeSend
hook, I see thatevent.exception.values
has:stacktrace
not related to actual exceptionvalue.stack
(please note that value isWebAssembly.Exception
).Wasm integration is not processing such event because of exception's
stacktrace
not containing any wasm frame source.Above scenario differs from wasm crash (not exception) that is properly processed by Sentry's wasm integration and thus properly seen from Sentry's UI. Following is example of
event
contents seen frombeforeSend
in crashing scenario (see comment inmain.cpp
to try yourself):The text was updated successfully, but these errors were encountered: