Chromium Code Reviews| 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..04744ece33e5ac0ecfdb32107b1ca9dadb0c6879 |
| --- /dev/null |
| +++ b/runtime/vm/gdb_helpers.cc |
| @@ -0,0 +1,82 @@ |
| +// 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 "vm/object.h" |
| +#include "vm/stack_frame.h" |
| + |
| +#include "lib/stacktrace.h" |
| + |
| +namespace dart { |
| + |
| +#if !defined(PRODUCT) |
| + |
| +DART_EXPORT |
| +void _printRawObject(RawObject* object) { |
|
zra
2017/06/29 21:06:12
Can we use namespaces or an AllStatic class to avo
rmacnak
2017/06/29 21:19:00
Putting these in a class interfers with the export
|
| + 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 |