Repository navigation
[flutter_tools] Fix deadlock in debug adapters when process exits early - #190931
Conversation
When launching a debug session, if the process exits before the debugger connects, the debug adapter would deadlock waiting for the debugger to initialize. This change sets `waitingForDebugger = true` before launching the process, and uses `Future.any` to wait for either `debuggerInitialized` or `debuggerInitializationFailedCompleter.future`. The completer is completed with an error when the session terminates, breaking the deadlock. Fixes flutter#190721
There was a problem hiding this comment.
Code Review
This pull request updates the Flutter debug adapters to handle early session termination during debugger initialization by introducing a debuggerInitializationFailedCompleter and a waitingForDebugger flag, allowing the adapter to fail fast if the process exits early. The review feedback identifies a potential unhandled asynchronous exception if the completer is completed with an error before listeners are attached, and points out that the new public fields lack required documentation.
| bool waitingForDebugger = false; | ||
| final Completer<void> debuggerInitializationFailedCompleter = Completer<void>(); |
There was a problem hiding this comment.
Issue: Potential Unhandled Asynchronous Exception & Missing Documentation
-
Unhandled Exception Risk: If
handleSessionTerminateis called whilelaunchAsProcessis running (wherewaitingForDebuggeristruebutFuture.anyhas not yet been awaited),debuggerInitializationFailedCompleter.completeErrorwill be called. Since there are no listeners ondebuggerInitializationFailedCompleter.futureat that moment, this will result in an unhandled asynchronous exception in Dart, which can crash the process or cause test flakiness.Adding a dummy error handler using
..future.catchError((Object _) {})at creation time safely prevents unhandled exceptions while still allowingFuture.anyto receive the error when it eventually listens to it. -
Missing Documentation: According to the Repository Style Guide (Line 62: "All public members should have documentation."), these new public fields should have
///doc comments explaining their purpose.
Here is the suggested improvement:
/// Whether the adapter is currently waiting for the debugger to initialize.
bool waitingForDebugger = false;
/// A completer that completes with an error if debugger initialization fails
/// (for example, if the session terminates early).
///
/// A dummy error handler is attached to the future to prevent unhandled
/// asynchronous exceptions if it completes before any listeners are active.
final Completer<void> debuggerInitializationFailedCompleter = Completer<void>()
..future.catchError((Object _) {});References
- All public members should have documentation. (link)
There was a problem hiding this comment.
Did the bot get smart?
I think it's right - flutter_test_adapter sets waitingForDebugger = true before an await, so if it happens before reading the Future.any(), there will be no listeners and this might be an unhandled error?
…initialization failure and document public members
|
autosubmit label was removed for flutter/flutter/190931, because - The status or check suite Dashboard Checks has failed. Please fix the issues identified (or deflake) before re-applying this label. |
|
autosubmit label was removed for flutter/flutter/190931, because - The status or check suite Dashboard Checks has failed. Please fix the issues identified (or deflake) before re-applying this label. |
…#12453) Manual roll Flutter from 27b098811f3b to c2437523d308 (179 revisions) Manual roll requested by tarrinneal@google.com flutter/flutter@27b0988...c243752 2026-08-12 matt.boetger@gmail.com Enable Gradle CI cache on all test targets that require android_sdk (flutter/flutter#190723) 2026-08-12 bkonyi@google.com [analysis] Reland "Added initial implementation of the flutter_analyzer_plugin (#175679)" (flutter/flutter#191022) 2026-08-12 matt.boetger@gmail.com Switch testing to gradle bin distribution type instead of all (flutter/flutter#190738) 2026-08-12 matt.boetger@gmail.com Convert Mockito instances in Kotlin to Mockk (flutter/flutter#189884) 2026-08-12 chingjun@google.com Report individual test results to LUCI ResultDB (flutter/flutter#190254) 2026-08-12 victorsanniay@gmail.com Toggleable reaction duration respects overrides (flutter/flutter#190857) 2026-08-12 engine-flutter-autoroll@skia.org Roll Skia from e00dbd7448c4 to fee7272f5bc2 (1 revision) (flutter/flutter#191007) 2026-08-12 30870216+gaaclarke@users.noreply.github.com Started caching text shadows by content. (flutter/flutter#190681) 2026-08-12 30870216+gaaclarke@users.noreply.github.com Adds agent skill for spawning led tasks. (flutter/flutter#190937) 2026-08-12 engine-flutter-autoroll@skia.org Roll Packages from aaaf246 to 94485f1 (8 revisions) (flutter/flutter#191008) 2026-08-12 82978131+herdiyana256@users.noreply.github.com flutter_tools: validate plugin identifiers before generating registrant code (flutter/flutter#190462) 2026-08-12 engine-flutter-autoroll@skia.org Roll Skia from 112f36148949 to e00dbd7448c4 (3 revisions) (flutter/flutter#190993) 2026-08-12 engine-flutter-autoroll@skia.org Roll Skia from 7d366c802307 to 112f36148949 (3 revisions) (flutter/flutter#190983) 2026-08-12 okorohelijah@google.com remove bringup for flavors test (flutter/flutter#190940) 2026-08-12 engine-flutter-autoroll@skia.org Roll Skia from 1f10a20bdd61 to 7d366c802307 (2 revisions) (flutter/flutter#190980) 2026-08-12 116356835+AbdeMohlbi@users.noreply.github.com Remove `--no-sim-use-hardfp` flag (flutter/flutter#190790) 2026-08-12 137456488+flutter-pub-roller-bot@users.noreply.github.com Roll pub packages (flutter/flutter#190977) 2026-08-12 engine-flutter-autoroll@skia.org Roll Skia from 339bedab6766 to 1f10a20bdd61 (1 revision) (flutter/flutter#190975) 2026-08-12 victorsanniay@gmail.com RawTooltip respects AnimationStyle updates and reverseCurve (flutter/flutter#190889) 2026-08-12 chris@bracken.jp ci: Support --target_arch option in prepare_package.dart (flutter/flutter#190960) 2026-08-12 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from SFq4FVodIOQAS26Lr... to -uHuSGv3wt7QAlDwa... (flutter/flutter#190973) 2026-08-12 aam@google.com Removes building of ci/android_debug_x86 as nobody should be consuming it. (flutter/flutter#190951) 2026-08-12 30870216+gaaclarke@users.noreply.github.com Adds error about wimp_heavy not being implemented. (flutter/flutter#189945) 2026-08-11 robert.ancell@canonical.com Add clang, cmake, and ninja deps to Linux windowing_test (flutter/flutter#190119) 2026-08-11 269567208+reidbaker-agent@users.noreply.github.com [AGP 9.1.0 Migration #1] Add Android Gradle Plugin Public API migration documentation (flutter/flutter#190842) 2026-08-11 bkonyi@google.com [flutter_tools] Fix deadlock in debug adapters when process exits early (flutter/flutter#190931) 2026-08-11 bkonyi@google.com [tool] Define modular dependency injection containers and bootstrapper (flutter/flutter#190724) 2026-08-11 1961493+harryterkelsen@users.noreply.github.com [web] Unify MaskFilter and ColorFilter primitives across CanvasKit and Skwasm (flutter/flutter#190314) 2026-08-11 137456488+flutter-pub-roller-bot@users.noreply.github.com Roll pub packages (flutter/flutter#190958) 2026-08-11 33794642+FelixMittermeier@users.noreply.github.com [Impeller] Move image upload scheduling waits to GPU disable (flutter/flutter#190445) 2026-08-11 30870216+gaaclarke@users.noreply.github.com Started generating the windows platform for macrobenchmarks (flutter/flutter#190932) 2026-08-11 1961493+harryterkelsen@users.noreply.github.com [web] Unify ui.Vertices (flutter/flutter#190563) 2026-08-11 jhy03261997@gmail.com Fix accessibility_inspector service extensions map mutability (flutter/flutter#190888) 2026-08-11 47866232+chunhtai@users.noreply.github.com Add batch3 a11y_assessment for vpat (flutter/flutter#189042) 2026-08-11 15619084+vashworth@users.noreply.github.com Remove Xcode environment when building swift tools in Xcode pre-action (flutter/flutter#190848) 2026-08-11 mdebbar@google.com [tool] Add missing play element in web test index.html to fix warning (flutter/flutter#190675) 2026-08-11 kkmk1999@gmail.com Offload blocking work in ProcessTextPlugin to the background (flutter/flutter#189823) 2026-08-11 bkonyi@google.com [flutter_tools] Replace usages of package:dds/dap.dart with package:dap_adapters/dap_adapters.dart (flutter/flutter#190667) 2026-08-11 15619084+vashworth@users.noreply.github.com Always update swift package dependencies (flutter/flutter#190886) 2026-08-11 bkonyi@google.com [flutter_tools] Add --preset option to flutter test (flutter/flutter#190878) 2026-08-11 jmccandless@google.com Include the examples cross imports checker in the analzyer. (flutter/flutter#190674) 2026-08-11 bkonyi@google.com [devicelab] Remove orphaned screenshot test files (flutter/flutter#190879) 2026-08-11 jason-simmons@users.noreply.github.com Remove the bringup flag from the linux_arm_host_desktop_engine builder (flutter/flutter#190935) 2026-08-11 mdebbar@google.com Reduce web_skwasm_tests subshards from 8 to 2 (flutter/flutter#190728) ...
When launching a debug session, if the target process exited early (e.g., due to a startup error, non-existent target, or failure before the VM service connects), the debug adapter would deadlock waiting indefinitely for
debuggerInitializedto complete.This change:
waitingForDebuggerand adds adebuggerInitializationFailedCompleterinFlutterBaseDebugAdapter.debuggerInitializationFailedCompleterwith aDebugAdapterExceptioninhandleSessionTerminateifwaitingForDebuggeris active.FlutterTestDebugAdapter.launchImplandFlutterDebugAdapter._handleAppStarted, racesdebuggerInitializedagainstdebuggerInitializationFailedCompleter.futureviaFuture.any, allowing the adapter to fail fast and terminate cleanly without hanging.Fixes #190721
Pre-launch Checklist
///).