From c30f998eb5dbea01581ea60aad5b0d6fda18f634 Mon Sep 17 00:00:00 2001 From: Jia Hao Date: Tue, 27 Feb 2024 16:39:49 +0800 Subject: [PATCH] [flutter_tools] Fix missing stack trace from daemon (#144113) When the daemon throws an exception, the receiving client is unable to surface stack traces from the daemon. This is because it is sent with the `trace` key here: https://github.com/flutter/flutter/blob/1e8dd1e4d6d70c5e06525bea3fb164a03d7a6c1d/packages/flutter_tools/lib/src/daemon.dart#L308 But the client tries to read it with the `stackTrace` key here: https://github.com/flutter/flutter/blob/1e8dd1e4d6d70c5e06525bea3fb164a03d7a6c1d/packages/flutter_tools/lib/src/daemon.dart#L343 Thanks to @mraleph for spotting this! *List which issues are fixed by this PR. You must list at least one issue. An issue is not required if the PR fixes something trivial like a typo.* b/326825892 --- packages/flutter_tools/lib/src/daemon.dart | 2 +- .../test/general.shard/daemon_test.dart | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/flutter_tools/lib/src/daemon.dart b/packages/flutter_tools/lib/src/daemon.dart index 898d2ee1b04..1ea8908d7dc 100644 --- a/packages/flutter_tools/lib/src/daemon.dart +++ b/packages/flutter_tools/lib/src/daemon.dart @@ -340,7 +340,7 @@ class DaemonConnection { // This is an error response. _logger.printTrace('<- Error response received from daemon, id = $id'); final Object error = data['error']!; - final String stackTrace = data['stackTrace'] as String? ?? ''; + final String stackTrace = data['trace'] as String? ?? ''; _outgoingRequestCompleters.remove(id)?.completeError(error, StackTrace.fromString(stackTrace)); } else { _logger.printTrace('<- Response received from daemon, id = $id'); diff --git a/packages/flutter_tools/test/general.shard/daemon_test.dart b/packages/flutter_tools/test/general.shard/daemon_test.dart index 300c55485b0..577b7ec90e0 100644 --- a/packages/flutter_tools/test/general.shard/daemon_test.dart +++ b/packages/flutter_tools/test/general.shard/daemon_test.dart @@ -173,7 +173,18 @@ void main() { final String id = message.data['id']! as String; daemonStreams.inputs.add(DaemonMessage({'id': id, 'error': 'some_error', 'trace': 'stack trace'})); - expect(requestFuture, throwsA('some_error')); + + Object? gotError; + StackTrace? gotStackTrace; + try { + await requestFuture; + } on Object catch (error, stackTrace) { + gotError = error; + gotStackTrace = stackTrace; + } + + expect(gotError, 'some_error'); + expect(gotStackTrace.toString(), 'stack trace'); }); });