OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "lib/stacktrace.h" | 5 #include "lib/stacktrace.h" |
6 #include "vm/object.h" | 6 #include "vm/object.h" |
7 #include "vm/stack_frame.h" | 7 #include "vm/stack_frame.h" |
8 | 8 |
9 namespace dart { | 9 namespace dart { |
10 | 10 |
11 #if !defined(PRODUCT) | 11 #if !defined(PRODUCT) |
12 | 12 |
13 DART_EXPORT | 13 DART_EXPORT |
14 void _printRawObject(RawObject* object) { | 14 void _printRawObject(RawObject* object) { |
15 OS::PrintErr("%s\n", Object::Handle(object).ToCString()); | 15 OS::PrintErr("%s\n", Object::Handle(object).ToCString()); |
16 } | 16 } |
17 | 17 |
18 | |
19 DART_EXPORT | 18 DART_EXPORT |
20 Object* _handle(RawObject* object) { | 19 Object* _handle(RawObject* object) { |
21 return &Object::Handle(object); | 20 return &Object::Handle(object); |
22 } | 21 } |
23 | 22 |
24 | |
25 // An utility method for convenient printing of dart stack traces when | 23 // An utility method for convenient printing of dart stack traces when |
26 // inside 'gdb'. Note: This function will only work when there is a | 24 // inside 'gdb'. Note: This function will only work when there is a |
27 // valid exit frame information. It will not work when a breakpoint is | 25 // valid exit frame information. It will not work when a breakpoint is |
28 // set in dart code and control is got inside 'gdb' without going through | 26 // set in dart code and control is got inside 'gdb' without going through |
29 // the runtime or native transition stub. | 27 // the runtime or native transition stub. |
30 DART_EXPORT | 28 DART_EXPORT |
31 void _printDartStackTrace() { | 29 void _printDartStackTrace() { |
32 const StackTrace& stacktrace = GetCurrentStackTrace(0); | 30 const StackTrace& stacktrace = GetCurrentStackTrace(0); |
33 OS::PrintErr("=== Current Trace:\n%s===\n", stacktrace.ToCString()); | 31 OS::PrintErr("=== Current Trace:\n%s===\n", stacktrace.ToCString()); |
34 } | 32 } |
35 | 33 |
36 | |
37 // Like _printDartStackTrace, but works in a NoSafepointScope. Use it if you're | 34 // Like _printDartStackTrace, but works in a NoSafepointScope. Use it if you're |
38 // in the middle of a GC or interested in stub frames. | 35 // in the middle of a GC or interested in stub frames. |
39 DART_EXPORT | 36 DART_EXPORT |
40 void _printStackTrace() { | 37 void _printStackTrace() { |
41 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames, | 38 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames, |
42 Thread::Current(), | 39 Thread::Current(), |
43 StackFrameIterator::kNoCrossThreadIteration); | 40 StackFrameIterator::kNoCrossThreadIteration); |
44 StackFrame* frame = frames.NextFrame(); | 41 StackFrame* frame = frames.NextFrame(); |
45 while (frame != NULL) { | 42 while (frame != NULL) { |
46 OS::PrintErr("%s\n", frame->ToCString()); | 43 OS::PrintErr("%s\n", frame->ToCString()); |
47 frame = frames.NextFrame(); | 44 frame = frames.NextFrame(); |
48 } | 45 } |
49 } | 46 } |
50 | 47 |
51 | |
52 class PrintObjectPointersVisitor : public ObjectPointerVisitor { | 48 class PrintObjectPointersVisitor : public ObjectPointerVisitor { |
53 public: | 49 public: |
54 PrintObjectPointersVisitor() : ObjectPointerVisitor(Isolate::Current()) {} | 50 PrintObjectPointersVisitor() : ObjectPointerVisitor(Isolate::Current()) {} |
55 | 51 |
56 void VisitPointers(RawObject** first, RawObject** last) { | 52 void VisitPointers(RawObject** first, RawObject** last) { |
57 for (RawObject** p = first; p <= last; p++) { | 53 for (RawObject** p = first; p <= last; p++) { |
58 Object& obj = Object::Handle(*p); | 54 Object& obj = Object::Handle(*p); |
59 OS::PrintErr("%p: %s\n", p, obj.ToCString()); | 55 OS::PrintErr("%p: %s\n", p, obj.ToCString()); |
60 } | 56 } |
61 } | 57 } |
62 }; | 58 }; |
63 | 59 |
64 | |
65 DART_EXPORT | 60 DART_EXPORT |
66 void _printStackTraceWithLocals() { | 61 void _printStackTraceWithLocals() { |
67 PrintObjectPointersVisitor visitor; | 62 PrintObjectPointersVisitor visitor; |
68 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames, | 63 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames, |
69 Thread::Current(), | 64 Thread::Current(), |
70 StackFrameIterator::kNoCrossThreadIteration); | 65 StackFrameIterator::kNoCrossThreadIteration); |
71 StackFrame* frame = frames.NextFrame(); | 66 StackFrame* frame = frames.NextFrame(); |
72 while (frame != NULL) { | 67 while (frame != NULL) { |
73 OS::PrintErr("%s\n", frame->ToCString()); | 68 OS::PrintErr("%s\n", frame->ToCString()); |
74 frame->VisitObjectPointers(&visitor); | 69 frame->VisitObjectPointers(&visitor); |
75 frame = frames.NextFrame(); | 70 frame = frames.NextFrame(); |
76 } | 71 } |
77 } | 72 } |
78 | 73 |
79 #endif // !PRODUCT | 74 #endif // !PRODUCT |
80 | 75 |
81 } // namespace dart | 76 } // namespace dart |
OLD | NEW |