| Index: runtime/lib/stacktrace.cc
|
| ===================================================================
|
| --- runtime/lib/stacktrace.cc (revision 27164)
|
| +++ runtime/lib/stacktrace.cc (working copy)
|
| @@ -30,18 +30,9 @@
|
| }
|
|
|
|
|
| -// Setup a full stack trace.
|
| -// Arg0: stack trace object.
|
| -// Return value: None.
|
| -DEFINE_NATIVE_ENTRY(Stacktrace_setupFullStacktrace, 1) {
|
| - const Stacktrace& trace =
|
| - Stacktrace::CheckedHandle(arguments->NativeArgAt(0));
|
| - const GrowableObjectArray& func_list =
|
| - GrowableObjectArray::Handle(GrowableObjectArray::New());
|
| - const GrowableObjectArray& code_list =
|
| - GrowableObjectArray::Handle(GrowableObjectArray::New());
|
| - const GrowableObjectArray& pc_offset_list =
|
| - GrowableObjectArray::Handle(GrowableObjectArray::New());
|
| +static void iterateFrames(const GrowableObjectArray& func_list,
|
| + const GrowableObjectArray& code_list,
|
| + const GrowableObjectArray& pc_offset_list) {
|
| StackFrameIterator frames(StackFrameIterator::kDontValidateFrames);
|
| StackFrame* frame = frames.NextFrame();
|
| ASSERT(frame != NULL); // We expect to find a dart invocation frame.
|
| @@ -90,6 +81,22 @@
|
| }
|
| frame = frames.NextFrame();
|
| }
|
| +}
|
| +
|
| +
|
| +// Setup a full stack trace.
|
| +// Arg0: stack trace object.
|
| +// Return value: None.
|
| +DEFINE_NATIVE_ENTRY(Stacktrace_setupFullStacktrace, 1) {
|
| + const Stacktrace& trace =
|
| + Stacktrace::CheckedHandle(arguments->NativeArgAt(0));
|
| + const GrowableObjectArray& func_list =
|
| + GrowableObjectArray::Handle(GrowableObjectArray::New());
|
| + const GrowableObjectArray& code_list =
|
| + GrowableObjectArray::Handle(GrowableObjectArray::New());
|
| + const GrowableObjectArray& pc_offset_list =
|
| + GrowableObjectArray::Handle(GrowableObjectArray::New());
|
| + iterateFrames(func_list, code_list, pc_offset_list);
|
| const Array& func_array = Array::Handle(Array::MakeArray(func_list));
|
| const Array& code_array = Array::Handle(Array::MakeArray(code_list));
|
| const Array& pc_offset_array =
|
| @@ -98,4 +105,27 @@
|
| return Object::null();
|
| }
|
|
|
| +
|
| +// 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 GrowableObjectArray& func_list =
|
| + GrowableObjectArray::Handle(GrowableObjectArray::New());
|
| + const GrowableObjectArray& code_list =
|
| + GrowableObjectArray::Handle(GrowableObjectArray::New());
|
| + const GrowableObjectArray& pc_offset_list =
|
| + GrowableObjectArray::Handle(GrowableObjectArray::New());
|
| + iterateFrames(func_list, code_list, pc_offset_list);
|
| + const Array& func_array = Array::Handle(Array::MakeArray(func_list));
|
| + 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(func_array, code_array, pc_offset_array));
|
| + OS::Print("%s\n", stacktrace.ToCString());
|
| +}
|
| +
|
| } // namespace dart
|
|
|