当前位置: 首页 > 知识库问答 >
问题:

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

满雨石
2023-03-14
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!';
}

我得到了堆栈跟踪。我所能跟踪的最远的回调是schedueasync()中的runasync()调用。没有留下schedueasync是从main调用的信息。

Unhandled exception:
Uncaught Error: oh no!
Stack Trace:
#0      runAsync (file:///home/myuser/dart/playground/bin/stack_trace/main.dart:14:3)
#1      scheduleAsync. (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      Timer._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)

Process finished with exit code 255

有没有一种方法可以获得完整的堆栈跟踪?

共有1个答案

滑令
2023-03-14

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

另请参见
-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                                                runAsync
main.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._run
package:stack_trace/src/stack_zone_specification.dart 134:18  registerUnaryCallback.
dart:async/zone.dart 902                                      _rootRunUnary
dart:async/zone.dart 804                                      _CustomZone.runUnary
dart:async/future_impl.dart 484                               _Future._propagateToListeners.handleValueCallback
dart:async/future_impl.dart 567                               _Future._propagateToListeners
dart:async/future_impl.dart 348                               _Future._complete
dart:async/future.dart 228                                    Future.Future.delayed.
package:stack_trace/src/stack_zone_specification.dart 210:15  StackZoneSpecification._run
package:stack_trace/src/stack_zone_specification.dart 124:52  registerCallback.
dart:async/zone.dart 891                                      _rootRun
dart:async/zone.dart 796                                      _CustomZone.run
dart:async/zone.dart 704                                      _CustomZone.runGuarded
dart:async/zone.dart 729                                      _CustomZone.bindCallback.
package:stack_trace/src/stack_zone_specification.dart 210:15  StackZoneSpecification._run
package:stack_trace/src/stack_zone_specification.dart 124:52  registerCallback.
dart:async/zone.dart 895                                      _rootRun
dart:async/zone.dart 796                                      _CustomZone.run
dart:async/zone.dart 704                                      _CustomZone.runGuarded
dart:async/zone.dart 729                                      _CustomZone.bindCallback.
dart:async-patch/timer_patch.dart 16                          Timer._createTimer.
dart:isolate-patch/timer_impl.dart 385                        _Timer._runTimers
dart:isolate-patch/timer_impl.dart 411                        _handleMessage
dart:isolate-patch/isolate_patch.dart 142                     _RawReceivePortImpl._handleMessage
===== asynchronous gap ===========================
dart:async/zone.dart 828                                      _CustomZone.registerUnaryCallback
dart:async/future_impl.dart 208                               _Future.then
main.dart 15:12                                               scheduleAsync
main.dart 6:18                                                main.
package:stack_trace/src/chain.dart 82:24                      Chain.capture.
dart:async/zone.dart 895                                      _rootRun
dart:async/zone.dart 796                                      _CustomZone.run
dart:async/zone.dart 1251                                     runZoned
package:stack_trace/src/chain.dart 80:20                      Chain.capture
main.dart 5:16                                                main
dart:isolate-patch/isolate_patch.dart 255                     _startIsolate.
dart:isolate-patch/isolate_patch.dart 142                     _RawReceivePortImpl._handleMessage


Process finished with exit code 0

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!';
}
oh no!
main.dart 19:3       runAsync
main.dart 15:28      scheduleAsync.
===== asynchronous gap ===========================
dart:async           _Future.then
main.dart 15:12      scheduleAsync
main.dart 6:18       main.
package:stack_trace  Chain.capture
main.dart 5:16       main


Process finished with exit code 0

 类似资料:
  • 问题内容: 更新 :Intellij IDEA的最新版本完全实现了我想要的功能。问题是如何在IDE外部实现此功能(以便我可以将异步堆栈跟踪信息转储到日志文件中),理想情况下无需使用检测代理。 自从我将应用程序从同步模型转换为异步模型以来,调试故障一直遇到问题。 当我使用同步API时,我总是在异常stacktraces中找到我的类,因此我知道从哪里开始寻找问题。使用异步API,我得到的堆栈跟踪既不引

  • 问题内容: Java的e.printStackTrace()不会打印内部异常的堆栈跟踪的所有详细信息。 有没有现成的方法来生成字符串形式的完整堆栈跟踪?(除了自己格式化外) 编辑 我刚刚发现printStackTrace()的作用-显然,它过滤掉的堆栈帧正是内部异常和外部异常共同的帧。因此,实际上这是我想要的,而不是“完整”堆栈跟踪。 问题答案: 我最终滚动了自己的代码(我采用了Throwable

  • 问题内容: 我确实有一个jenkins实例,它陷入了某种无休止的循环,没有任何可见的活动。 我可以获得正在运行的进程的信息,那么如何生成可用于错误报告的跟踪? 我在linux上运行。 问题答案: 尝试使用jstack。它会为您提供线程正在执行的操作的完整列表。它所需要的只是进程pid。

  • 问题内容: 最近,我问是否要报告捕获到的异常的文本。出乎意料的是,大多数答案都误解了我的问题,并以为我在问是否要报告堆栈跟踪以获取捕获的异常,这表明这样做是正常的。所以我要问一个后续问题。 在例外情况下,应该或不应该在什么情况下报告堆栈跟踪?通过“报告”,我包括要求一个日志记录框架为您记录堆栈跟踪 我不问是否报告 的东西 。我在问那个报告是否应该包括堆栈跟踪。 问题答案: 它取决于上下文。例如,当

  • 问题内容: 如何获得Java中的当前堆栈跟踪,就像你可以在.NET中那样? 我找到了,但这不是我想要的-我想找回堆栈跟踪信息,而不是打印出来。 问题答案: 你可以使用。 这将返回一个数组,该数组代表程序的当前堆栈跟踪。

  • 在我们的日志文件中,我们发现以下内容: 只有这一行,没有异常堆栈跟踪。 出现此异常的try块正在执行使用javassist创建的动态生成的Java字节码。 我想知道两件事: : null 丢失的堆栈跟踪,尽管在块内使用调用日志挂钩,这通常会导致完整的堆栈跟踪被打印在日志文件中。 我的问题: > 什么样的代码会导致日志输出“java.lang.ArrayIndexOutOfBoundsExcepti