getsentry / sentry-react-native

Official Sentry SDK for React Native
https://sentry.io
MIT License
1.56k stars 330 forks source link

Invariant Violation when passing an object with Infinity into `addBreadcrumb` #4024

Open thomasttvo opened 4 weeks ago

thomasttvo commented 4 weeks ago

OS:

Platform:

SDK:

SDK version: 5.29.0

react-native version: 0.73.5

Are you using Expo?

Are you using sentry.io or on-premise?

Calling addBreadcrumb on Android with an Infinity value throws an error, which may crash the app in certain cases. We don't usually mean to call it with an Infinity value, but it's hard to control what's being logged automatically.

I think at the very least, Sentry should wrap its methods around try/catch internally and log the errors to avoid them affecting the main application?

try {
  Sentry.addBreadcrumb({
     category: 'redux.action',
     type: 'info',
     data: { x: Infinity },
  });
} catch(e) {
  console.log(e)
}
Invariant Violation: [{"timestamp":1723673438.573,"category":"redux.action","type":"info","data":{"x":"<<Infinity>>"},"level":"info"}] is not usable as a native method argument, js engine: hermes
krystofwoldrich commented 3 weeks ago

Hi @thomasttvo, thank you for the message,

we recommend adding know data structures to the breadcrumb, but regardless that, the addBreadcrumbs function should not throw.

krystofwoldrich commented 3 weeks ago
krystofwoldrich commented 3 weeks ago

After running the sample code I'm not getting the same error but malformed JS call.

It looks like RN serialization error.

thomasttvo commented 3 weeks ago

After running the sample code I'm not getting the same error but malformed JS call.

It looks like RN serialization error.

I believe the malformed JS is caused by RN catching the uncaught error and doing some processing with it. If you wrap it around a try/catch, you'll get the error I mentioned

krystofwoldrich commented 3 weeks ago

Thank you, I did that, but the malformed JS is a native error and is not captured by the JS try/catch.