gpt4 book ai didi

dart - 如何获取异步执行的完整堆栈跟踪

转载 作者:行者123 更新时间:2023-12-04 18:39:48 37 4
gpt4 key购买 nike

对于一个像这样的小例子

import 'dart:async';
import 'package:stack_trace/stack_trace.dart';

void main() {
scheduleAsync();
}

void scheduleAsync() {
new Future.delayed(new Duration(seconds: 1))
.then((_) => runAsync());
}

void runAsync() {
throw 'oh no!';
}

我得到了这个堆栈跟踪。我可以追踪回电的最远距离是 runAsync()。来电 scheduleAsync() .
没有留下任何信息, scheduleAsyncmain 调用.

未处理的异常:
Uncaught Error :哦,不!
堆栈跟踪:
#0 runAsync (file:///home/myuser/dart/playground/bin/stack_trace/main.dart:14:3)
#1 调度异步。 (file:///home/myuser/dart/playground/bin/stack_trace/main.dart:10:28)
#2 _RootZone.runUnary (dart:async/zone.dart:1155)
#3 _Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:484)
#4 _Future._propagateToListeners (dart:async/future_impl.dart:567)
#5 _Future._complete (dart:async/future_impl.dart:348)
#6 Future.Future.delayed。 (dart:async/future.dart:228)
#7 定时器._createTimer。 (dart:async-patch/timer_patch.dart:16)
#8 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:385)
#9 _handleMessage (dart:isolate-patch/timer_impl.dart:411)
#10 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:142)

#0 _rootHandleUncaughtError。 (dart:async/zone.dart:886)
#1 _asyncRunCallbackLoop (dart:async/schedule_microtask.dart:41)
#2 _asyncRunCallback (dart:async/schedule_microtask.dart:48)
#3 _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:96)
#4 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:392)
#5 _handleMessage (dart:isolate-patch/timer_impl.dart:411)
#6 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:142)

进程以退出代码 255 结束

有没有办法获得完整的堆栈跟踪?

最佳答案

stack_tracehttps://pub.dartlang.org/packages/stack_trace将整个堆栈跟踪放在一起。

也可以看看
- this blog post来自 stack_trace 包的开发人员。
- http://news.dartlang.org/2016/01/unboxing-packages-stacktrace.html?m=1

import 'dart:async';
import 'package:stack_trace/stack_trace.dart';

void main() {
Chain.capture(() {
scheduleAsync(); // <= pass my code in Chain.capture
}, onError: (error, stack) {
print(error);
print(stack);
});
}

void scheduleAsync() {
new Future.delayed(new Duration(seconds: 1))
.then((_) => runAsync());
}

void runAsync() {
throw 'oh no!';
}

产生这个输出,它允许回溯到 main 中的第一行.
oh no!main.dart 19:3                                                runAsyncmain.dart 15:28                                               scheduleAsync.package:stack_trace/src/stack_zone_specification.dart 134:26  registerUnaryCallback..package:stack_trace/src/stack_zone_specification.dart 210:15  StackZoneSpecification._runpackage:stack_trace/src/stack_zone_specification.dart 134:18  registerUnaryCallback.dart:async/zone.dart 902                                      _rootRunUnarydart:async/zone.dart 804                                      _CustomZone.runUnarydart:async/future_impl.dart 484                               _Future._propagateToListeners.handleValueCallbackdart:async/future_impl.dart 567                               _Future._propagateToListenersdart:async/future_impl.dart 348                               _Future._completedart:async/future.dart 228                                    Future.Future.delayed.package:stack_trace/src/stack_zone_specification.dart 210:15  StackZoneSpecification._runpackage:stack_trace/src/stack_zone_specification.dart 124:52  registerCallback.dart:async/zone.dart 891                                      _rootRundart:async/zone.dart 796                                      _CustomZone.rundart:async/zone.dart 704                                      _CustomZone.runGuardeddart:async/zone.dart 729                                      _CustomZone.bindCallback.package:stack_trace/src/stack_zone_specification.dart 210:15  StackZoneSpecification._runpackage:stack_trace/src/stack_zone_specification.dart 124:52  registerCallback.dart:async/zone.dart 895                                      _rootRundart:async/zone.dart 796                                      _CustomZone.rundart:async/zone.dart 704                                      _CustomZone.runGuardeddart:async/zone.dart 729                                      _CustomZone.bindCallback.dart:async-patch/timer_patch.dart 16                          Timer._createTimer.dart:isolate-patch/timer_impl.dart 385                        _Timer._runTimersdart:isolate-patch/timer_impl.dart 411                        _handleMessagedart:isolate-patch/isolate_patch.dart 142                     _RawReceivePortImpl._handleMessage===== asynchronous gap ===========================dart:async/zone.dart 828                                      _CustomZone.registerUnaryCallbackdart:async/future_impl.dart 208                               _Future.thenmain.dart 15:12                                               scheduleAsyncmain.dart 6:18                                                main.package:stack_trace/src/chain.dart 82:24                      Chain.capture.dart:async/zone.dart 895                                      _rootRundart:async/zone.dart 796                                      _CustomZone.rundart:async/zone.dart 1251                                     runZonedpackage:stack_trace/src/chain.dart 80:20                      Chain.capturemain.dart 5:16                                                maindart:isolate-patch/isolate_patch.dart 255                     _startIsolate.dart:isolate-patch/isolate_patch.dart 142                     _RawReceivePortImpl._handleMessageProcess finished with exit code 0

Even more useful is the terse version

import 'dart:async';
import 'package:stack_trace/stack_trace.dart';

void main() {
Chain.capture(() {
scheduleAsync();
}, onError: (error, stack) {
print(error);
print(new Trace.from(stack).terse);
});
}

void scheduleAsync() {
new Future.delayed(new Duration(seconds: 1))
.then((_) => runAsync());
}

void runAsync() {
throw 'oh no!';
}

产生:

不好了!
main.dart 19:3 runAsync
main.dart 15:28 scheduleAsync。
===== 异步间隙 ============================
Dart :异步_Future.then
main.dart 15:12 scheduleAsync
main.dart 6:18 主要。
包:stack_trace Chain.capture
main.dart 5:16 主要

进程以退出代码 0 结束

关于dart - 如何获取异步执行的完整堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29013591/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com