OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 #ifndef RUNTIME_VM_DEBUGGER_H_ | 5 #ifndef RUNTIME_VM_DEBUGGER_H_ |
6 #define RUNTIME_VM_DEBUGGER_H_ | 6 #define RUNTIME_VM_DEBUGGER_H_ |
7 | 7 |
8 #include "include/dart_tools_api.h" | 8 #include "include/dart_tools_api.h" |
9 | 9 |
10 #include "vm/object.h" | 10 #include "vm/object.h" |
11 #include "vm/port.h" | 11 #include "vm/port.h" |
12 #include "vm/service_event.h" | 12 #include "vm/service_event.h" |
13 | 13 |
14 DECLARE_FLAG(bool, verbose_debug); | 14 DECLARE_FLAG(bool, verbose_debug); |
15 | 15 |
16 // 'Trace Debugger' TD_Print. | 16 // 'Trace Debugger' TD_Print. |
17 #if defined(_MSC_VER) | 17 #if defined(_MSC_VER) |
18 #define TD_Print(format, ...) \ | 18 #define TD_Print(format, ...) \ |
19 if (FLAG_verbose_debug) Log::Current()->Print(format, __VA_ARGS__) | 19 if (FLAG_verbose_debug) Log::Current()->Print(format, __VA_ARGS__) |
20 #else | 20 #else |
21 #define TD_Print(format, ...) \ | 21 #define TD_Print(format, ...) \ |
22 if (FLAG_verbose_debug) Log::Current()->Print(format, ##__VA_ARGS__) | 22 if (FLAG_verbose_debug) Log::Current()->Print(format, ##__VA_ARGS__) |
23 #endif | 23 #endif |
24 | 24 |
25 | |
26 namespace dart { | 25 namespace dart { |
27 | 26 |
28 class CodeBreakpoint; | 27 class CodeBreakpoint; |
29 class Isolate; | 28 class Isolate; |
30 class JSONArray; | 29 class JSONArray; |
31 class JSONStream; | 30 class JSONStream; |
32 class ObjectPointerVisitor; | 31 class ObjectPointerVisitor; |
33 class RemoteObjectCache; | 32 class RemoteObjectCache; |
34 class BreakpointLocation; | 33 class BreakpointLocation; |
35 class StackFrame; | 34 class StackFrame; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 ConditionKind kind_; | 95 ConditionKind kind_; |
97 Breakpoint* next_; | 96 Breakpoint* next_; |
98 RawInstance* closure_; | 97 RawInstance* closure_; |
99 BreakpointLocation* bpt_location_; | 98 BreakpointLocation* bpt_location_; |
100 bool is_synthetic_async_; | 99 bool is_synthetic_async_; |
101 | 100 |
102 friend class BreakpointLocation; | 101 friend class BreakpointLocation; |
103 DISALLOW_COPY_AND_ASSIGN(Breakpoint); | 102 DISALLOW_COPY_AND_ASSIGN(Breakpoint); |
104 }; | 103 }; |
105 | 104 |
106 | |
107 // BreakpointLocation represents a collection of breakpoint conditions at the | 105 // BreakpointLocation represents a collection of breakpoint conditions at the |
108 // same token position in Dart source. There may be more than one CodeBreakpoint | 106 // same token position in Dart source. There may be more than one CodeBreakpoint |
109 // object per BreakpointLocation. | 107 // object per BreakpointLocation. |
110 // An unresolved breakpoint is one where the underlying code has not | 108 // An unresolved breakpoint is one where the underlying code has not |
111 // been compiled yet. Since the code has not been compiled, we don't know | 109 // been compiled yet. Since the code has not been compiled, we don't know |
112 // the definitive source location yet. The requested source location may | 110 // the definitive source location yet. The requested source location may |
113 // change when the underlying code gets compiled. | 111 // change when the underlying code gets compiled. |
114 // A latent breakpoint represents a breakpoint location in Dart source | 112 // A latent breakpoint represents a breakpoint location in Dart source |
115 // that is not loaded in the VM when the breakpoint is requested. | 113 // that is not loaded in the VM when the breakpoint is requested. |
116 // When a script with matching url is loaded, a latent breakpoint | 114 // When a script with matching url is loaded, a latent breakpoint |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 | 180 |
183 // Valid for resolved breakpoints: | 181 // Valid for resolved breakpoints: |
184 RawFunction* function_; | 182 RawFunction* function_; |
185 intptr_t line_number_; | 183 intptr_t line_number_; |
186 intptr_t column_number_; | 184 intptr_t column_number_; |
187 | 185 |
188 friend class Debugger; | 186 friend class Debugger; |
189 DISALLOW_COPY_AND_ASSIGN(BreakpointLocation); | 187 DISALLOW_COPY_AND_ASSIGN(BreakpointLocation); |
190 }; | 188 }; |
191 | 189 |
192 | |
193 // CodeBreakpoint represents a location in compiled code. There may be | 190 // CodeBreakpoint represents a location in compiled code. There may be |
194 // more than one CodeBreakpoint for one BreakpointLocation, e.g. when a | 191 // more than one CodeBreakpoint for one BreakpointLocation, e.g. when a |
195 // function gets compiled as a regular function and as a closure. | 192 // function gets compiled as a regular function and as a closure. |
196 class CodeBreakpoint { | 193 class CodeBreakpoint { |
197 public: | 194 public: |
198 CodeBreakpoint(const Code& code, | 195 CodeBreakpoint(const Code& code, |
199 TokenPosition token_pos, | 196 TokenPosition token_pos, |
200 uword pc, | 197 uword pc, |
201 RawPcDescriptors::Kind kind); | 198 RawPcDescriptors::Kind kind); |
202 ~CodeBreakpoint(); | 199 ~CodeBreakpoint(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 // DebugBreak. This is an instruction that was replaced. DebugBreak | 241 // DebugBreak. This is an instruction that was replaced. DebugBreak |
245 // will execute it after the breakpoint. | 242 // will execute it after the breakpoint. |
246 Instr saved_value_; | 243 Instr saved_value_; |
247 Instr saved_value_fastsmi_; | 244 Instr saved_value_fastsmi_; |
248 #endif | 245 #endif |
249 | 246 |
250 friend class Debugger; | 247 friend class Debugger; |
251 DISALLOW_COPY_AND_ASSIGN(CodeBreakpoint); | 248 DISALLOW_COPY_AND_ASSIGN(CodeBreakpoint); |
252 }; | 249 }; |
253 | 250 |
254 | |
255 // ActivationFrame represents one dart function activation frame | 251 // ActivationFrame represents one dart function activation frame |
256 // on the call stack. | 252 // on the call stack. |
257 class ActivationFrame : public ZoneAllocated { | 253 class ActivationFrame : public ZoneAllocated { |
258 public: | 254 public: |
259 enum Kind { | 255 enum Kind { |
260 kRegular, | 256 kRegular, |
261 kAsyncSuspensionMarker, | 257 kAsyncSuspensionMarker, |
262 kAsyncCausal, | 258 kAsyncCausal, |
263 kAsyncActivation, | 259 kAsyncActivation, |
264 }; | 260 }; |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 bool vars_initialized_; | 409 bool vars_initialized_; |
414 LocalVarDescriptors& var_descriptors_; | 410 LocalVarDescriptors& var_descriptors_; |
415 ZoneGrowableArray<intptr_t> desc_indices_; | 411 ZoneGrowableArray<intptr_t> desc_indices_; |
416 PcDescriptors& pc_desc_; | 412 PcDescriptors& pc_desc_; |
417 | 413 |
418 friend class Debugger; | 414 friend class Debugger; |
419 friend class DebuggerStackTrace; | 415 friend class DebuggerStackTrace; |
420 DISALLOW_COPY_AND_ASSIGN(ActivationFrame); | 416 DISALLOW_COPY_AND_ASSIGN(ActivationFrame); |
421 }; | 417 }; |
422 | 418 |
423 | |
424 // Array of function activations on the call stack. | 419 // Array of function activations on the call stack. |
425 class DebuggerStackTrace : public ZoneAllocated { | 420 class DebuggerStackTrace : public ZoneAllocated { |
426 public: | 421 public: |
427 explicit DebuggerStackTrace(int capacity) : trace_(capacity) {} | 422 explicit DebuggerStackTrace(int capacity) : trace_(capacity) {} |
428 | 423 |
429 intptr_t Length() const { return trace_.length(); } | 424 intptr_t Length() const { return trace_.length(); } |
430 | 425 |
431 ActivationFrame* FrameAt(int i) const { return trace_[i]; } | 426 ActivationFrame* FrameAt(int i) const { return trace_[i]; } |
432 | 427 |
433 ActivationFrame* GetHandlerFrame(const Instance& exc_obj) const; | 428 ActivationFrame* GetHandlerFrame(const Instance& exc_obj) const; |
434 | 429 |
435 private: | 430 private: |
436 void AddActivation(ActivationFrame* frame); | 431 void AddActivation(ActivationFrame* frame); |
437 void AddMarker(ActivationFrame::Kind marker); | 432 void AddMarker(ActivationFrame::Kind marker); |
438 void AddAsyncCausalFrame(uword pc, const Code& code); | 433 void AddAsyncCausalFrame(uword pc, const Code& code); |
439 | 434 |
440 ZoneGrowableArray<ActivationFrame*> trace_; | 435 ZoneGrowableArray<ActivationFrame*> trace_; |
441 | 436 |
442 friend class Debugger; | 437 friend class Debugger; |
443 DISALLOW_COPY_AND_ASSIGN(DebuggerStackTrace); | 438 DISALLOW_COPY_AND_ASSIGN(DebuggerStackTrace); |
444 }; | 439 }; |
445 | 440 |
446 | |
447 class Debugger { | 441 class Debugger { |
448 public: | 442 public: |
449 enum ResumeAction { | 443 enum ResumeAction { |
450 kContinue, | 444 kContinue, |
451 kStepInto, | 445 kStepInto, |
452 kStepOver, | 446 kStepOver, |
453 kStepOut, | 447 kStepOut, |
454 kStepRewind, | 448 kStepRewind, |
455 kStepOverAsyncSuspension, | 449 kStepOverAsyncSuspension, |
456 }; | 450 }; |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
711 void Pause(ServiceEvent* event); | 705 void Pause(ServiceEvent* event); |
712 | 706 |
713 void HandleSteppingRequest(DebuggerStackTrace* stack_trace, | 707 void HandleSteppingRequest(DebuggerStackTrace* stack_trace, |
714 bool skip_next_step = false); | 708 bool skip_next_step = false); |
715 | 709 |
716 void CacheStackTraces(DebuggerStackTrace* stack_trace, | 710 void CacheStackTraces(DebuggerStackTrace* stack_trace, |
717 DebuggerStackTrace* async_causal_stack_trace, | 711 DebuggerStackTrace* async_causal_stack_trace, |
718 DebuggerStackTrace* awaiter_stack_trace); | 712 DebuggerStackTrace* awaiter_stack_trace); |
719 void ClearCachedStackTraces(); | 713 void ClearCachedStackTraces(); |
720 | 714 |
721 | |
722 // Can we rewind to the indicated frame? | 715 // Can we rewind to the indicated frame? |
723 bool CanRewindFrame(intptr_t frame_index, const char** error) const; | 716 bool CanRewindFrame(intptr_t frame_index, const char** error) const; |
724 | 717 |
725 void RewindToFrame(intptr_t frame_index); | 718 void RewindToFrame(intptr_t frame_index); |
726 void RewindToUnoptimizedFrame(StackFrame* frame, const Code& code); | 719 void RewindToUnoptimizedFrame(StackFrame* frame, const Code& code); |
727 void RewindToOptimizedFrame(StackFrame* frame, | 720 void RewindToOptimizedFrame(StackFrame* frame, |
728 const Code& code, | 721 const Code& code, |
729 intptr_t post_deopt_frame_index); | 722 intptr_t post_deopt_frame_index); |
730 | 723 |
731 void ResetSteppingFramePointers(); | 724 void ResetSteppingFramePointers(); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 | 784 |
792 Dart_ExceptionPauseInfo exc_pause_info_; | 785 Dart_ExceptionPauseInfo exc_pause_info_; |
793 | 786 |
794 static EventHandler* event_handler_; | 787 static EventHandler* event_handler_; |
795 | 788 |
796 friend class Isolate; | 789 friend class Isolate; |
797 friend class BreakpointLocation; | 790 friend class BreakpointLocation; |
798 DISALLOW_COPY_AND_ASSIGN(Debugger); | 791 DISALLOW_COPY_AND_ASSIGN(Debugger); |
799 }; | 792 }; |
800 | 793 |
801 | |
802 } // namespace dart | 794 } // namespace dart |
803 | 795 |
804 #endif // RUNTIME_VM_DEBUGGER_H_ | 796 #endif // RUNTIME_VM_DEBUGGER_H_ |
OLD | NEW |