Repository navigation
getLayoutExplorerNode stack overflow when clicking on the inspected button #5946
Copy link
Copy link
Closed
flutter/flutter
#131486Labels
P1high priority issues at the top of the work list, actively being worked on.high priority issues at the top of the work list, actively being worked on.
Description
- run
flutter create some_bare_app cd some_bare_appflutter run -d macos- open up the devtools link
- start widget inspection
- click on the plus button
- click on the plus button again.
- You will now get the following error:
A Dart VM Service on macOS is available at: http://127.0.0.1:60374/bj__zCuNnVg=/
The Flutter DevTools debugger and profiler on macOS is available at:
http://127.0.0.1:9103?uri=http://127.0.0.1:60374/bj__zCuNnVg=/
══╡ EXCEPTION CAUGHT BY FLUTTER FRAMEWORK ╞═════════════════════════════════════════════════════════
The following StackOverflowError was thrown during a service extension callback for
"ext.flutter.inspector.getLayoutExplorerNode":
Stack Overflow
When the exception was thrown, this was the stack:
#1 _LinkedHashMapMixin._insert (dart:collection-patch/compact_hash.dart)
#2 _LinkedHashMapMixin._set (dart:collection-patch/compact_hash.dart:519:7)
#3 _LinkedHashMapMixin._init (dart:collection-patch/compact_hash.dart:440:15)
#4 _LinkedHashMapMixin._rehash (dart:collection-patch/compact_hash.dart:408:7)
#5 _LinkedHashMapMixin._insert (dart:collection-patch/compact_hash.dart:464:7)
#6 _LinkedHashMapMixin._set (dart:collection-patch/compact_hash.dart:519:7)
#7 MapBase.addAll.<anonymous closure> (dart:collection/maps.dart:41:11)
#8 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:625:13)
#9 DiagnosticsNode.toJsonMap.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1635:21)
#10 DiagnosticsNode.toJsonMap (package:flutter/src/foundation/diagnostics.dart:1650:6)
#11 DiagnosticsProperty.toJsonMap (package:flutter/src/foundation/diagnostics.dart:2618:45)
#12 FlagProperty.toJsonMap (package:flutter/src/foundation/diagnostics.dart:2120:45)
#13 DiagnosticsNode.toJsonList.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1675:19)
#14 new _GrowableList._ofEfficientLengthIterable (dart:core-patch/growable_array.dart:189:27)
#15 DiagnosticsNode.toJsonList (package:flutter/src/foundation/diagnostics.dart:1676:8)
#16 DiagnosticsNode.toJsonMap.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1637:25)
#17 DiagnosticsNode.toJsonMap (package:flutter/src/foundation/diagnostics.dart:1650:6)
#18 WidgetInspectorService._getLayoutExplorerNode.<anonymous closure>
(package:flutter/src/widgets/widget_inspector.dart:2058:62)
#19 InspectorSerializationDelegate.additionalNodeProperties
(package:flutter/src/widgets/widget_inspector.dart:3628:53)
#20 DiagnosticsNode.toJsonMap.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1635:21)
#21 DiagnosticsNode.toJsonMap (package:flutter/src/foundation/diagnostics.dart:1650:6)
#22 _ElementDiagnosticableTreeNode.toJsonMap (package:flutter/src/widgets/framework.dart:5052:45)
#23 WidgetInspectorService._getLayoutExplorerNode.<anonymous closure>
(package:flutter/src/widgets/widget_inspector.dart:2066:61)
#24 InspectorSerializationDelegate.additionalNodeProperties
(package:flutter/src/widgets/widget_inspector.dart:3628:53)
#25 DiagnosticsNode.toJsonMap.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1635:21)
#26 DiagnosticsNode.toJsonMap (package:flutter/src/foundation/diagnostics.dart:1650:6)
#27 _ElementDiagnosticableTreeNode.toJsonMap (package:flutter/src/widgets/framework.dart:5052:45)
#28 WidgetInspectorService._getLayoutExplorerNode.<anonymous closure>
(package:flutter/src/widgets/widget_inspector.dart:2066:61)
#29 InspectorSerializationDelegate.additionalNodeProperties
(package:flutter/src/widgets/widget_inspector.dart:3628:53)
#30 DiagnosticsNode.toJsonMap.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1635:21)
#31 DiagnosticsNode.toJsonMap (package:flutter/src/foundation/diagnostics.dart:1650:6)
#32 _ElementDiagnosticableTreeNode.toJsonMap (package:flutter/src/widgets/framework.dart:5052:45)
#33 WidgetInspectorService._getLayoutExplorerNode.<anonymous closure>
(package:flutter/src/widgets/widget_inspector.dart:2066:61)
#34 InspectorSerializationDelegate.additionalNodeProperties
(package:flutter/src/widgets/widget_inspector.dart:3628:53)
#35 DiagnosticsNode.toJsonMap.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1635:21)
#36 DiagnosticsNode.toJsonMap (package:flutter/src/foundation/diagnostics.dart:1650:6)
#37 _ElementDiagnosticableTreeNode.toJsonMap (package:flutter/src/widgets/framework.dart:5052:45)
#38 WidgetInspectorService._getLayoutExplorerNode.<anonymous closure>
(package:flutter/src/widgets/widget_inspector.dart:2066:61)
#39 InspectorSerializationDelegate.additionalNodeProperties
(package:flutter/src/widgets/widget_inspector.dart:3628:53)
#40 DiagnosticsNode.toJsonMap.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1635:21)
#41 DiagnosticsNode.toJsonMap (package:flutter/src/foundation/diagnostics.dart:1650:6)
#42 _ElementDiagnosticableTreeNode.toJsonMap (package:flutter/src/widgets/framework.dart:5052:45)
#43 WidgetInspectorService._getLayoutExplorerNode.<anonymous closure>
(package:flutter/src/widgets/widget_inspector.dart:2066:61)
...
...
#3350 DiagnosticsNode.toJsonMap.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1635:21)
#3351 DiagnosticsNode.toJsonMap (package:flutter/src/foundation/diagnostics.dart:1650:6)
#3352 _ElementDiagnosticableTreeNode.toJsonMap (package:flutter/src/widgets/framework.dart:5052:45)
#3353 WidgetInspectorService._getLayoutExplorerNode.<anonymous closure>
(package:flutter/src/widgets/widget_inspector.dart:2066:61)
#3354 InspectorSerializationDelegate.additionalNodeProperties
(package:flutter/src/widgets/widget_inspector.dart:3628:53)
#3355 DiagnosticsNode.toJsonMap.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1635:21)
#3356 DiagnosticsNode.toJsonMap (package:flutter/src/foundation/diagnostics.dart:1650:6)
#3357 _ElementDiagnosticableTreeNode.toJsonMap (package:flutter/src/widgets/framework.dart:5052:45)
#3358 WidgetInspectorService._getLayoutExplorerNode.<anonymous closure>
(package:flutter/src/widgets/widget_inspector.dart:2066:61)
#3359 InspectorSerializationDelegate.additionalNodeProperties
(package:flutter/src/widgets/widget_inspector.dart:3628:53)
#3360 DiagnosticsNode.toJsonMap.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1635:21)
#3361 DiagnosticsNode.toJsonMap (package:flutter/src/foundation/diagnostics.dart:1650:6)
#3362 _ElementDiagnosticableTreeNode.toJsonMap (package:flutter/src/widgets/framework.dart:5052:45)
#3363 WidgetInspectorService._getLayoutExplorerNode.<anonymous closure>
(package:flutter/src/widgets/widget_inspector.dart:2066:61)
#3364 InspectorSerializationDelegate.additionalNodeProperties
(package:flutter/src/widgets/widget_inspector.dart:3628:53)
#3365 DiagnosticsNode.toJsonMap.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1635:21)
#3366 DiagnosticsNode.toJsonMap (package:flutter/src/foundation/diagnostics.dart:1650:6)
#3367 _ElementDiagnosticableTreeNode.toJsonMap (package:flutter/src/widgets/framework.dart:5052:45)
#3368 DiagnosticsNode.toJsonList.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1675:19)
#3369 ListIterator.moveNext (dart:_internal/iterable.dart:344:26)
#3370 new _GrowableList._ofEfficientLengthIterable (dart:core-patch/growable_array.dart:189:27)
#3371 new _GrowableList.of (dart:core-patch/growable_array.dart:150:28)
#3372 new List.of (dart:core-patch/array_patch.dart:47:28)
#3373 ListIterable.toList (dart:_internal/iterable.dart:214:7)
#3374 DiagnosticsNode.toJsonList (package:flutter/src/foundation/diagnostics.dart:1676:8)
#3375 DiagnosticsNode.toJsonMap.<anonymous closure> (package:flutter/src/foundation/diagnostics.dart:1643:23)
#3376 DiagnosticsNode.toJsonMap (package:flutter/src/foundation/diagnostics.dart:1650:6)
#3377 _ElementDiagnosticableTreeNode.toJsonMap (package:flutter/src/widgets/framework.dart:5052:45)
#3378 WidgetInspectorService._nodeToJson (package:flutter/src/widgets/widget_inspector.dart:1644:18)
#3379 WidgetInspectorService._getLayoutExplorerNode (package:flutter/src/widgets/widget_inspector.dart:2038:14)
#3380 BindingBase.registerServiceExtension.<anonymous closure> (package:flutter/src/foundation/binding.dart:958:32)
#3390 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:189:12)
(elided 10 frames from class _AssertionError, class _Timer, dart:async, and dart:async-patch)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
P1high priority issues at the top of the work list, actively being worked on.high priority issues at the top of the work list, actively being worked on.
Activity
CoderDake commentedon Jun 26, 2023
Another way to reproduce this error appears to be scrolling up and down a widget tree with the keyboard arrows.
When I tested this it was on a smaller screen so that the widgets i was scrolling up and down to were off of the screen, and the focus needed to autoscroll to catch up.
It also appears that the current BETA does not have this issue:
But the latest candidate does:
CoderDake commentedon Jun 26, 2023
There are still errors on the BETA but they are not the stack overflow errors like we see on stable:
here is a snippet of some of the errors seen on BETA
ext.flutter.inspector.getDetailsSubtree: (-32000) Server error
{"exception":"type 'StatelessElement' is not a subtype of type 'DiagnosticsNode?' in type cast","stack":"#0 WidgetInspectorService._getDetailsSubtree (package:flutter/src/widgets/widget_inspector.dart:1901:48)\n#1 WidgetInspectorService.initServiceExtensions. (package:flutter/src/widgets/widget_inspector.dart:1170:21)\n#2 BindingBase.registerServiceExtension. (package:flutter/src/foundation/binding.dart:953:32)\n\n","method":"ext.flutter.inspector.getDetailsSubtree"}
chC @ main.dart.js:45536
main.dart.js:45536 [zoneGuarded]: ext.flutter.inspector.getProperties: (-32000) Server error
{"exception":"type 'StatelessElement' is not a subtype of type 'DiagnosticsNode?' in type cast","stack":"#0 WidgetInspectorService._getProperties (package:flutter/src/widgets/widget_inspector.dart:1726:63)\n#1 WidgetInspectorService._registerServiceExtensionWithArg. (package:flutter/src/widgets/widget_inspector.dart:874:35)\n#2 BindingBase.registerServiceExtension. (package:flutter/src/foundation/binding.dart:953:32)\n\n","method":"ext.flutter.inspector.getProperties"}
chC @ main.dart.js:45536
main.dart.js:5740 Uncaught Error
at Object.rq (main.dart.js:5811:24)
at main.dart.js:154875:5
at by5.a (main.dart.js:4428:62)
at by5.$2 (main.dart.js:55311:14)
at Object.m (main.dart.js:4414:10)
at yh.aAz (main.dart.js:154889:10)
at yh.cf (main.dart.js:154868:25)
at yh.ke (main.dart.js:154853:13)
at hF.ke (main.dart.js:86247:44)
at main.dart.js:91114:14
main.dart.js:45536 [zoneGuarded]: ext.flutter.inspector.getLayoutExplorerNode: (-32000) Server error
{"exception":"type 'MultiChildRenderObjectElement' is not a subtype of type 'DiagnosticsNode' in type cast","stack":"#0 WidgetInspectorService._getLayoutExplorerNode (package:flutter/src/widgets/widget_inspector.dart:2010:12)\n#1 BindingBase.registerServiceExtension. (package:flutter/src/foundation/binding.dart:953:32)\n\n","method":"ext.flutter.inspector.getLayoutExplorerNode"}
chC @ main.dart.js:45536
main.dart.js:5740 Uncaught Error
at Object.rq (main.dart.js:5811:24)
at main.dart.js:154875:5
at by5.a (main.dart.js:4428:62)
at by5.$2 (main.dart.js:55311:14)
at Object.m (main.dart.js:4414:10)
at yh.aAz (main.dart.js:154889:10)
at yh.cf (main.dart.js:154868:25)
at yh.ke (main.dart.js:154853:13)
at hF.ke (main.dart.js:86247:44)
at main.dart.js:91114:14
main.dart.js:45536 ext.flutter.inspector.getDetailsSubtree: (-32000) Server error
{"exception":"type 'StatelessElement' is not a subtype of type 'DiagnosticsNode?' in type cast","stack":"#0 WidgetInspectorService._getDetailsSubtree (package:flutter/src/widgets/widget_inspector.dart:1901:48)\n#1 WidgetInspectorService.initServiceExtensions. (package:flutter/src/widgets/widget_inspector.dart:1170:21)\n#2 BindingBase.registerServiceExtension. (package:flutter/src/foundation/binding.dart:953:32)\n\n","method":"ext.flutter.inspector.getDetailsSubtree"}
chC @ main.dart.js:45536
main.dart.js:45536 [zoneGuarded]: ext.flutter.inspector.getProperties: (-32000) Server error
{"exception":"type 'StatelessElement' is not a subtype of type 'DiagnosticsNode?' in type cast","stack":"#0 WidgetInspectorService._getProperties (package:flutter/src/widgets/widget_inspector.dart:1726:63)\n#1 WidgetInspectorService._registerServiceExtensionWithArg. (package:flutter/src/widgets/widget_inspector.dart:874:35)\n#2 BindingBase.registerServiceExtension. (package:flutter/src/foundation/binding.dart:953:32)\n\n","method":"ext.flutter.inspector.getProperties"}
polina-c commentedon Jun 26, 2023
Repeating part:
CoderDake commentedon Jul 27, 2023
it looks like clicking on a single element triggers 10s of thousands of calls to additional node props.
there are certain large culprits. For example clicking on the floating action button in the devtools widget tree trigger ~150k calls to additionalNodeProperties.
It then throws a stack overflow.
So perhaps there is something about that specific element that recurses?
CoderDake commentedon Jul 27, 2023
Looking into this more I used a static hash to keep track of the DiagnosticsNode objects that we were looking through.
I was able to find out that the FloatingActionButton keeps getting looped through. So somehow it keeps coming back to itself
CoderDake commentedon Jul 28, 2023
Diving even deeper, it looks like it is the Tooltip that causes a loop.
I can reproduce this my wrapping a text element with a tooltip and then inspecting that text element
CoderDake commentedon Jul 31, 2023
Jacob mentions that we may just not want to go deeper for RenderObjects Instead
Fix for endless recursion for getLayoutExplorerNode on a Tooltip (#13…
Fix for endless recursion for getLayoutExplorerNode on a Tooltip (flu…