getsentry / sentry-dart

Sentry SDK for Dart and Flutter
https://sentry.io/for/flutter/
MIT License
761 stars 239 forks source link

Crash: stacktrace_utils.dart in getCurrentStackTrace within sentry #2146

Closed flodaniel closed 3 months ago

flodaniel commented 4 months ago

Platform

Flutter Mobile

Obfuscation

Enabled

Debug Info

Enabled

Doctor

[✓] Flutter (Channel stable, 3.22.1, on macOS 14.4.1 23E224 darwin-arm64, locale en-AT) • Flutter version 3.22.1 on channel stable at /Users/floriandaniel/fvm/versions/3.22.1 • Upstream repository https://github.com/flutter/flutter.git • Framework revision a14f74ff3a (6 weeks ago), 2024-05-22 11:08:21 -0500 • Engine revision 55eae6864b • Dart version 3.4.1 • DevTools version 2.34.3

[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0) • Android SDK at /Users/floriandaniel/Library/Android/sdk • Platform android-34, build-tools 34.0.0 • ANDROID_HOME = /Users/floriandaniel/Library/Android/sdk • Java binary at: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 17.0.7+0-17.0.7b1000.6-10550314) • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 15.4) • Xcode at /Applications/Xcode.app/Contents/Developer • Build 15F31d • CocoaPods version 1.15.2

[✓] Chrome - develop for the web • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 2023.1) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 17.0.7+0-17.0.7b1000.6-10550314)

[✓] IntelliJ IDEA Community Edition (version 2023.2.2) • IntelliJ at /Applications/IntelliJ IDEA CE.app • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart

[✓] VS Code (version 1.90.2) • VS Code at /Applications/Visual Studio Code.app/Contents • Flutter extension version 3.90.0

Version

8.3.0

Steps to Reproduce

  1. Trying to report a PhoenixException from the phoenix_socket:0.6.4 package (so far only on iOS)
  2. Reported exception in sentry shows that it failed to get the stacktrace

Expected Result

I expect a proper stacktrace. It also looks like the beforeSend is then not called for the PhoenixException as I am actually trying to ignore those directly on the device.

Actual Result

Actual StackTrace:

PhoenixException: PhoenixException: socket closed
  File "stacktrace_utils.dart", line 10, in getCurrentStackTrace
  File "sentry_exception_factory.dart", line 45, in SentryExceptionFactory.getSentryException
  File "sentry_client.dart", line 201, in SentryClient._prepareEvent
  File "sentry_client.dart", line 95, in SentryClient.captureEvent
  File "hub.dart", line 173, in Hub.captureException
  File "<asynchronous suspension>"
  File "sentry_service.dart", line 69, in SentryService.recordError

Are you willing to submit a PR?

None

krystofwoldrich commented 4 months ago

Hi @flodaniel, thank you for the message, the stack trace you are seeing is attached by the SDK in case the original exception, in this case PhoenixException does not contain its own stack trace.

Could you share you current implementation of the beforeSend and how do you capture the PhoenixException, does it contain stack trace?

flodaniel commented 4 months ago

Thank you for the reply. I did not know that! This is my shortened beforeSend method:

  static FutureOr<SentryEvent?> beforeSend(SentryEvent event, Hint hint) {
    final throwable = event.throwable;
    /// here are actually much more checks for all kind of other exceptions

    /// used by knock as a socket connection
    if (throwable is PhoenixException) {
      return null;
    }

    return event;
  }

This is how I set up sentry. I am not using the appRunner due to https://github.com/getsentry/sentry-dart/issues/1943#issuecomment-2185880234

void main() async {
  await runZonedGuarded(() async {
    await SentryFlutter.init(
      (options) {
        options
          ..dsn = 'DNS'
          ..tracesSampleRate = 0.5
          ..profilesSampleRate = Endpoint.current.isProduction() ? 0.5 : 0
          ..environment = Endpoint.current.name
          ..beforeSend = SentryService.beforeSend;
      },
    );

    return runApp(
      AppInjector(),
    );
  }, (error, stackTrace) async {
    unawaited(SentryService().recordError(error, stackTrace: stackTrace));
  });
}

And this is my recordError method:

  Future<void> recordError(
    dynamic exception, {
    StackTrace? stackTrace,
    String? stringHint,
    Map<String, dynamic>? mapHint,
  }) async {

    await Sentry.captureException(
      exception,
      stackTrace: stackTrace,
      withScope: (scope) {
        if (stringHint != null) {
          scope.setContexts('Extra Data (string)', stringHint);
        }
        if (mapHint != null) {
          scope.setContexts('Extra Data (map)', mapHint);
        }
      },
    );
  }
buenaflor commented 4 months ago

Hi, which platform are you using

flodaniel commented 4 months ago

Hi, which platform are you using

The described behavior is on iOS

buenaflor commented 4 months ago

Got it, this should be related to #2148

seems like the stacktrace is truncated so we're not seeing the full context, we'll look into it

buenaflor commented 4 months ago

If we don't have a stacktrace supplied we call StackTrace.current internally that's why it looks like it crashed in the Sentry SDK

flodaniel commented 4 months ago

Can this call be wrapped in a try-catch? No matter what the beforeSend hook should allow me to drop or modify events even if the stacktrace is not available. As it is right now it looks like the beforeSend is no longer called due to the crash.

buenaflor commented 4 months ago

@flodaniel the stacktrace is misleading. the error is not crashing in stacktrace utils

see this PR on fixing this issue: https://github.com/getsentry/sentry-dart/pull/2152

Can this call be wrapped in a try-catch

that won't do anything, the error is PhoenixException: PhoenixException: socket closed and not the sentry sdk, we just have to provide the proper stacktrace

flodaniel commented 4 months ago

Thanks for explaining.

That also means me dropping the PhoenixException in my beforeSend should already work? As shared in this comment above (https://github.com/getsentry/sentry-dart/issues/2146#issuecomment-2210500698) I am trying to ignore it, but I still see the PhoenixException in my sentry instance and I don't understand how a better stacktrace would change that.

buenaflor commented 4 months ago

Do you have a sure way to reproduce the PhoenixException?

you can try this

final exception = event.exceptions
    ?.firstWhereOrNull((element) => element.type == 'PhoenixException');
if (exception != null) {
  return null;
}
flodaniel commented 4 months ago

Do you have a sure way to reproduce the PhoenixException?

Unfortunately no :( I will wait on the PR you linked which might help me to reproduce it somehow.

buenaflor commented 4 months ago

could you share a screenshot of the event page? or you can send the event link to me to giancarlo.buenaflor@sentry.io if you don't want to share anything here.

buenaflor commented 3 months ago

hey we've release 8.5.0 which includes a fix to improve the stacktrace you mentioned

buenaflor commented 3 months ago

Closing this now, please feel free to reopen if you still have any issues