| Index: runtime/vm/gdb_helpers.cc
|
| diff --git a/runtime/vm/gdb_helpers.cc b/runtime/vm/gdb_helpers.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b50d912e0edf5010d2db0204e46cfde31ca88760
|
| --- /dev/null
|
| +++ b/runtime/vm/gdb_helpers.cc
|
| @@ -0,0 +1,81 @@
|
| +// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +#include "lib/stacktrace.h"
|
| +#include "vm/object.h"
|
| +#include "vm/stack_frame.h"
|
| +
|
| +namespace dart {
|
| +
|
| +#if !defined(PRODUCT)
|
| +
|
| +DART_EXPORT
|
| +void _printRawObject(RawObject* object) {
|
| + OS::PrintErr("%s\n", Object::Handle(object).ToCString());
|
| +}
|
| +
|
| +
|
| +DART_EXPORT
|
| +Object* _handle(RawObject* object) {
|
| + return &Object::Handle(object);
|
| +}
|
| +
|
| +
|
| +// 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.
|
| +DART_EXPORT
|
| +void _printDartStackTrace() {
|
| + const StackTrace& stacktrace = GetCurrentStackTrace(0);
|
| + OS::PrintErr("=== Current Trace:\n%s===\n", stacktrace.ToCString());
|
| +}
|
| +
|
| +
|
| +// Like _printDartStackTrace, but works in a NoSafepointScope. Use it if you're
|
| +// in the middle of a GC or interested in stub frames.
|
| +DART_EXPORT
|
| +void _printStackTrace() {
|
| + StackFrameIterator frames(StackFrameIterator::kDontValidateFrames,
|
| + Thread::Current(),
|
| + StackFrameIterator::kNoCrossThreadIteration);
|
| + StackFrame* frame = frames.NextFrame();
|
| + while (frame != NULL) {
|
| + OS::PrintErr("%s\n", frame->ToCString());
|
| + frame = frames.NextFrame();
|
| + }
|
| +}
|
| +
|
| +
|
| +class PrintObjectPointersVisitor : public ObjectPointerVisitor {
|
| + public:
|
| + PrintObjectPointersVisitor() : ObjectPointerVisitor(Isolate::Current()) {}
|
| +
|
| + void VisitPointers(RawObject** first, RawObject** last) {
|
| + for (RawObject** p = first; p <= last; p++) {
|
| + Object& obj = Object::Handle(*p);
|
| + OS::PrintErr("%p: %s\n", p, obj.ToCString());
|
| + }
|
| + }
|
| +};
|
| +
|
| +
|
| +DART_EXPORT
|
| +void _printStackTraceWithLocals() {
|
| + PrintObjectPointersVisitor visitor;
|
| + StackFrameIterator frames(StackFrameIterator::kDontValidateFrames,
|
| + Thread::Current(),
|
| + StackFrameIterator::kNoCrossThreadIteration);
|
| + StackFrame* frame = frames.NextFrame();
|
| + while (frame != NULL) {
|
| + OS::PrintErr("%s\n", frame->ToCString());
|
| + frame->VisitObjectPointers(&visitor);
|
| + frame = frames.NextFrame();
|
| + }
|
| +}
|
| +
|
| +#endif // !PRODUCT
|
| +
|
| +} // namespace dart
|
|
|