commit | 4e0ee0275b0a4e0eec9cd1372c0cb087bef60dbb | [log] [tgz] |
---|---|---|
author | nweiz@google.com <nweiz@google.com> | Tue Aug 20 21:41:33 2013 +0000 |
committer | nweiz@google.com <nweiz@google.com> | Tue Aug 20 21:41:33 2013 +0000 |
tree | f16507ff686e63b5d972a113e080f7a342703914 | |
parent | 01d9a3decad9909be63fb67036b06df87386786c [diff] |
Properly parse V8 stack traces that contain the exception description. R=rnystrom@google.com BUG=12151 Review URL: https://codereview.chromium.org//23159007 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/stack_trace@26395 260f80e4-7a28-3924-810f-c04153c831b5
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.
Trace
s 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>