5

考虑这样的代码:

import 'dart:async';

foo() {
  new Timer(onesec, bar);
}

bar() {
  throw "from bar";
}

const onesec = const Duration(seconds:1);

main() {
  runZoned(() {
  new Timer(onesec, foo);
  },
  onError: (e, stackTrace) => print(stackTrace));
}

我怎么能知道我打印出来的那个bar是“调用”的?foostackTrace

我想看到类似的东西:

bar
...
foo
...
main
4

1 回答 1

6

看看stack_trace 包。它使用区域来跟踪异步回调。为每个异步回调捕获堆栈跟踪是昂贵的,但对于调试来说绝对值得。

包的示例输出:

http://dartlang.org/foo/bar.dart 10:11  Foo.<fn>.bar
http://dartlang.org/foo/baz.dart        Foo.<fn>.bar
===== asynchronous gap ===========================
http://dartlang.org/foo/bang.dart 10:11  Foo.<fn>.bar
http://dartlang.org/foo/quux.dart        Foo.<fn>.bar

根据文档,获取这些痕迹的最简单方法是使用Chain.capture.

于 2014-02-27T01:26:44.923 回答