Skip to content

flutter error integration calls original handler with stale error #3186

@ardera

Description

@ardera

Platform

Flutter Wasm, Flutter Web, Flutter Desktop Linux, Flutter Desktop Windows, Flutter Mobile Android, Flutter Mobile iOS

Obfuscation

Enabled

Debug Info

Enabled

Doctor

flutter version: 3.32.5

Version

8.14.2

Steps to Reproduce

It's a race condition and thus unreliable to reproduce, but the root cause is here:

await hub.captureEvent(event, stackTrace: stackTrace, hint: hint);
// we don't call Zone.current.handleUncaughtError because we'd like
// to set a specific mechanism for FlutterError.onError.
} else {
options.log(
SentryLevel.debug,
'Error not captured due to [FlutterErrorDetails.silent], '
'Enable [SentryFlutterOptions.reportSilentFlutterErrors] '
'if you wish to capture silent errors',
);
}
// Call original handler, regardless of `errorDetails.silent` or
// `reportSilentFlutterErrors`. This ensures, that we don't swallow
// messages.
if (_defaultOnError != null) {
_defaultOnError!(errorDetails);
}

The sentry error integration calls the original error handler with the reported error, but that might only happen after an async await, and apparently some parts of the flutter error can't be used across async gaps.

For example, the flutter widget inspector error handler will serialize the diagnostics node, with all its render objects, etc:
https://github.com/flutter/flutter/blob/7438e5491588fdb0852161fd2b8df46b32515d37/packages/flutter/lib/src/widgets/widget_inspector.dart#L1008-L1032

And that might fail if the render objects are already diposed. E.g. calling debugDescribeChildren on a RenderParagraph (Text widget) throws an error for me. (See actual result)

Expected Result

No error.

Actual Result

This is the call stack when the error happens: (The exception is Null check operator used on a null value)

RenderParagraph.text (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\rendering\paragraph.dart:391)
RenderParagraph.debugDescribeChildren (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\rendering\paragraph.dart:1398)
DiagnosticableTreeNode.getChildren (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:2968)
DiagnosticsNode.toJsonMap.<anonymous closure> (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1644)
DiagnosticsNode.toJsonMap (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1670)
DiagnosticsNode.toJsonList.<anonymous closure> (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1717)
MappedListIterable.elementAt (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\internal\iterable.dart:442)
ListIterator.moveNext (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\internal\iterable.dart:371)
new _GrowableList._ofEfficientLengthIterable (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\_internal\vm\lib\growable_array.dart:194)
new _GrowableList.of (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\_internal\vm\lib\growable_array.dart:154)
new List.of (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\_internal\vm\lib\array_patch.dart:40)
ListIterable.toList (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\internal\iterable.dart:224)
DiagnosticsNode.toJsonList (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1718)
DiagnosticsNode.toJsonMap.<anonymous closure> (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1667)
DiagnosticsNode.toJsonMap (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1670)
DiagnosticsNode.toJsonList.<anonymous closure> (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1717)
MappedListIterable.elementAt (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\internal\iterable.dart:442)
ListIterator.moveNext (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\internal\iterable.dart:371)
new _GrowableList._ofEfficientLengthIterable (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\_internal\vm\lib\growable_array.dart:194)
new _GrowableList.of (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\_internal\vm\lib\growable_array.dart:154)
new List.of (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\_internal\vm\lib\array_patch.dart:40)
ListIterable.toList (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\internal\iterable.dart:224)
DiagnosticsNode.toJsonList (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1718)
DiagnosticsNode.toJsonMap.<anonymous closure> (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1667)
DiagnosticsNode.toJsonMap (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1670)
DiagnosticsNode.toJsonList.<anonymous closure> (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1717)
MappedListIterable.elementAt (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\internal\iterable.dart:442)
ListIterator.moveNext (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\internal\iterable.dart:371)
new _GrowableList._ofEfficientLengthIterable (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\_internal\vm\lib\growable_array.dart:194)
new _GrowableList.of (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\_internal\vm\lib\growable_array.dart:154)
new List.of (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\_internal\vm\lib\array_patch.dart:40)
ListIterable.toList (c:\Users\HannesWinkler\devel\flutter\bin\cache\pkg\sky_engine\lib\internal\iterable.dart:224)
DiagnosticsNode.toJsonList (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1718)
DiagnosticsNode.toJsonMap.<anonymous closure> (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1661)
DiagnosticsNode.toJsonMap (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\foundation\diagnostics.dart:1670)
WidgetInspectorService._nodeToJson (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\widgets\widget_inspector.dart:1774)
WidgetInspectorService._reportStructuredError (c:\Users\HannesWinkler\devel\flutter\packages\flutter\lib\src\widgets\widget_inspector.dart:1010)
FlutterErrorIntegration.call.<anonymous closure> (d:\.pub-cache\hosted\pub.dev\sentry_flutter-8.14.2\lib\src\integrations\flutter_error_integration.dart:106)
<asynchronous gap> (Unknown Source:0)

Are you willing to submit a PR?

None

Metadata

Metadata

Assignees

Labels

Projects

Status

No status

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions