2014-02-27 4 views
5

Betrachten Code wie folgt:Kann ich eine "Stack-Trace", die alle asynchronen Anrufe verfolgt, mit 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)); 
} 

Wie kann ich sagen, dass bar wurde von foo im stackTrace „genannt“, das ich ausdrucken?

Ich möchte etwas sehen, wie:

bar 
... 
foo 
... 
main 

Antwort

6

Werfen Sie einen Blick auf die stack_trace package. Es verwendet Zonen, um asynchrone Rückrufe zu verfolgen. Das Erfassen von Stack-Traces für jeden asynchronen Callback ist zwar teuer, aber für das Debugging lohnt es sich auf jeden Fall.

Beispielausgabe aus dem Paket:

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 

Nach den doc, ist der einfachste Weg, um diese Spuren zu bekommen, ist Chain.capture zu verwenden.