Могу ли я получить трассировку стека, которая отслеживает все асинхронные вызовы с помощью Dart?

Рассмотрим такой код:

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 был "вызван" foo в stackTrace, которое я распечатываю?

Я хотел бы увидеть что-то вроде:

bar
...
foo
...
main

person Seth Ladd    schedule 27.02.2014    source источник


Ответы (1)


Взгляните на пакет 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.

person Florian Loitsch    schedule 27.02.2014