dart-sdk/pkg/stack_trace
nweiz@google.com 23bf53be66 Use the stack_trace library in scheduled_test.
This also adds a couple features to stack_trace.

Review URL: https://codereview.chromium.org//13157004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@20752 260f80e4-7a28-3924-810f-c04153c831b5
2013-04-01 20:46:15 +00:00
..
lib Use the stack_trace library in scheduled_test. 2013-04-01 20:46:15 +00:00
test Use the stack_trace library in scheduled_test. 2013-04-01 20:46:15 +00:00
pubspec.yaml Add a library for manipulating stack traces. 2013-03-27 21:15:55 +00:00
README.md Add a library for manipulating stack traces. 2013-03-27 21:15:55 +00:00

This library provides the ability to parse, inspect, and manipulate stack traces produced by the underlying Dart implementation. It also provides functions to produce string representations of stack traces in a more readable format than the native StackTrace implementation.

Traces can be parsed from native StackTraces using Trace.from, or captured using Trace.current. Native StackTraces can also be directly converted to human-readable strings using Trace.format.

Here's an example native stack trace from debugging this library:

#0      Object.noSuchMethod (dart:core-patch:1884:25)
#1      Trace.terse.<anonymous closure> (file:///usr/local/google-old/home/goog/dart/dart/pkg/stack_trace/lib/src/trace.dart:47:21)
#2      IterableMixinWorkaround.reduce (dart:collection:29:29)
#3      List.reduce (dart:core-patch:1247:42)
#4      Trace.terse (file:///usr/local/google-old/home/goog/dart/dart/pkg/stack_trace/lib/src/trace.dart:40:35)
#5      format (file:///usr/local/google-old/home/goog/dart/dart/pkg/stack_trace/lib/stack_trace.dart:24:28)
#6      main.<anonymous closure> (file:///usr/local/google-old/home/goog/dart/dart/test.dart:21:29)
#7      _CatchErrorFuture._sendError (dart:async:525:24)
#8      _FutureImpl._setErrorWithoutAsyncTrace (dart:async:393:26)
#9      _FutureImpl._setError (dart:async:378:31)
#10     _ThenFuture._sendValue (dart:async:490:16)
#11     _FutureImpl._handleValue.<anonymous closure> (dart:async:349:28)
#12     Timer.run.<anonymous closure> (dart:async:2402:21)
#13     Timer.Timer.<anonymous closure> (dart:async-patch:15:15)

and its human-readable representation:

dart:core-patch                             Object.noSuchMethod
pkg/stack_trace/lib/src/trace.dart 47:21    Trace.terse.<fn>
dart:collection                             IterableMixinWorkaround.reduce
dart:core-patch                             List.reduce
pkg/stack_trace/lib/src/trace.dart 40:35    Trace.terse
pkg/stack_trace/lib/stack_trace.dart 24:28  format
test.dart 21:29                             main.<fn>
dart:async                                  _CatchErrorFuture._sendError
dart:async                                  _FutureImpl._setErrorWithoutAsyncTrace
dart:async                                  _FutureImpl._setError
dart:async                                  _ThenFuture._sendValue
dart:async                                  _FutureImpl._handleValue.<fn>
dart:async                                  Timer.run.<fn>
dart:async-patch                            Timer.Timer.<fn>

You can further clean up the stack trace using Trace.terse. This folds together multiple stack frames from the Dart core libraries, so that only the core library method that was directly called from user code is visible. For example:

dart:core                                   Object.noSuchMethod
pkg/stack_trace/lib/src/trace.dart 47:21    Trace.terse.<fn>
dart:core                                   List.reduce
pkg/stack_trace/lib/src/trace.dart 40:35    Trace.terse
pkg/stack_trace/lib/stack_trace.dart 24:28  format
test.dart 21:29                             main.<fn>
dart:async                                  Timer.Timer.<fn>