| Index: runtime/lib/stacktrace.cc
|
| diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc
|
| index 6175b24b4d18d841ce132233347e27e3053439a3..7b793141f2c5f0de3c120a6b3abc85ea48bbb399 100644
|
| --- a/runtime/lib/stacktrace.cc
|
| +++ b/runtime/lib/stacktrace.cc
|
| @@ -11,7 +11,8 @@
|
| namespace dart {
|
|
|
| static void IterateFrames(const GrowableObjectArray& code_list,
|
| - const GrowableObjectArray& pc_offset_list) {
|
| + const GrowableObjectArray& pc_offset_list,
|
| + int skip_frames) {
|
| StackFrameIterator frames(StackFrameIterator::kDontValidateFrames);
|
| StackFrame* frame = frames.NextFrame();
|
| ASSERT(frame != NULL); // We expect to find a dart invocation frame.
|
| @@ -19,33 +20,49 @@ static void IterateFrames(const GrowableObjectArray& code_list,
|
| Smi& offset = Smi::Handle();
|
| while (frame != NULL) {
|
| if (frame->IsDartFrame()) {
|
| - code = frame->LookupDartCode();
|
| - offset = Smi::New(frame->pc() - code.EntryPoint());
|
| - code_list.Add(code);
|
| - pc_offset_list.Add(offset);
|
| + if (skip_frames > 0) {
|
| + skip_frames--;
|
| + } else {
|
| + code = frame->LookupDartCode();
|
| + offset = Smi::New(frame->pc() - code.EntryPoint());
|
| + code_list.Add(code);
|
| + pc_offset_list.Add(offset);
|
| + }
|
| }
|
| frame = frames.NextFrame();
|
| }
|
| }
|
|
|
| -
|
| -// An utility method for convenient printing of dart stack traces when
|
| -// inside 'gdb'. Note: This function will only work when there is a
|
| -// valid exit frame information. It will not work when a breakpoint is
|
| -// set in dart code and control is got inside 'gdb' without going through
|
| -// the runtime or native transition stub.
|
| -void _printCurrentStacktrace() {
|
| +// Creates a Stacktrace object from the current stack.
|
| +//
|
| +// Skips the first skip_frames Dart frames.
|
| +static const Stacktrace& GetCurrentStacktrace(int skip_frames) {
|
| const GrowableObjectArray& code_list =
|
| GrowableObjectArray::Handle(GrowableObjectArray::New());
|
| const GrowableObjectArray& pc_offset_list =
|
| GrowableObjectArray::Handle(GrowableObjectArray::New());
|
| - IterateFrames(code_list, pc_offset_list);
|
| + IterateFrames(code_list, pc_offset_list, skip_frames);
|
| const Array& code_array = Array::Handle(Array::MakeArray(code_list));
|
| const Array& pc_offset_array =
|
| Array::Handle(Array::MakeArray(pc_offset_list));
|
| const Stacktrace& stacktrace = Stacktrace::Handle(
|
| Stacktrace::New(code_array, pc_offset_array));
|
| + return stacktrace;
|
| +}
|
| +
|
| +// An utility method for convenient printing of dart stack traces when
|
| +// inside 'gdb'. Note: This function will only work when there is a
|
| +// valid exit frame information. It will not work when a breakpoint is
|
| +// set in dart code and control is got inside 'gdb' without going through
|
| +// the runtime or native transition stub.
|
| +void _printCurrentStacktrace() {
|
| + const Stacktrace& stacktrace = GetCurrentStacktrace(0);
|
| OS::PrintErr("=== Current Trace:\n%s===\n", stacktrace.ToCString());
|
| }
|
|
|
| +DEFINE_NATIVE_ENTRY(StackTrace_current, 0) {
|
| + const Stacktrace& stacktrace = GetCurrentStacktrace(1);
|
| + return stacktrace.raw();
|
| +}
|
| +
|
| } // namespace dart
|
|
|