getsentry / sentry-dart

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

Crash: stacktrace_utils.dart in getCurrentStackTrace within sentry #2146

Open flodaniel opened 3 days ago

flodaniel commented 3 days 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 3 days 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 3 days 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 2 days ago

Hi, which platform are you using

flodaniel commented 2 days ago

Hi, which platform are you using

The described behavior is on iOS