Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 VM_DEBUGGER_H_ | 5 #ifndef VM_DEBUGGER_H_ |
| 6 #define VM_DEBUGGER_H_ | 6 #define VM_DEBUGGER_H_ |
| 7 | 7 |
| 8 #include "vm/object.h" | 8 #include "vm/object.h" |
| 9 | 9 |
| 10 namespace dart { | 10 namespace dart { |
| 11 | 11 |
| 12 class Breakpoint; | 12 class SourceBreakpoint; |
| 13 class CodeBreakpoint; | |
| 13 class Isolate; | 14 class Isolate; |
| 14 class ObjectPointerVisitor; | 15 class ObjectPointerVisitor; |
| 15 class ActiveVariables; | 16 class ActiveVariables; |
| 16 | 17 |
| 17 | 18 |
| 18 // Breakpoint represents a location in Dart source and the corresponding | 19 // SourceBreakpoint represents a user-specified breakpoint location in |
| 19 // address in compiled code. | 20 // Dart source. There may be more than one CodeBreakpoint object per |
| 20 class Breakpoint { | 21 // SourceBreakpoint. |
| 22 class SourceBreakpoint { | |
| 21 public: | 23 public: |
| 22 Breakpoint(const Function& func, intptr_t pc_desc_index); | 24 SourceBreakpoint(const Function& func, intptr_t token_index); |
| 23 | 25 |
| 24 RawFunction* function() const { return function_; } | 26 RawFunction* function() const { return function_; } |
| 25 uword pc() const { return pc_; } | |
| 26 intptr_t token_index() const { return token_index_; } | 27 intptr_t token_index() const { return token_index_; } |
| 27 bool is_temporary() const { return is_temporary_; } | |
| 28 void set_temporary(bool value) { is_temporary_ = value; } | |
| 29 | 28 |
| 30 RawScript* SourceCode(); | 29 RawScript* SourceCode(); |
| 31 RawString* SourceUrl(); | 30 RawString* SourceUrl(); |
| 32 intptr_t LineNumber(); | 31 intptr_t LineNumber(); |
| 33 | 32 |
| 34 void SetActive(bool value); | 33 void Enable(); |
| 35 bool IsActive(); | 34 void Disable(); |
| 35 bool IsEnabled() const { return is_enabled_; } | |
|
regis
2012/03/02 17:54:53
According to our coding style, it should be is_ena
hausner
2012/03/02 18:01:19
Forward ditto.
| |
| 36 | 36 |
| 37 private: | 37 private: |
| 38 void VisitObjectPointers(ObjectPointerVisitor* visitor); | 38 void VisitObjectPointers(ObjectPointerVisitor* visitor); |
| 39 | 39 |
| 40 void set_next(Breakpoint* value) { next_ = value; } | 40 void set_next(SourceBreakpoint* value) { next_ = value; } |
| 41 Breakpoint* next() const { return this->next_; } | 41 SourceBreakpoint* next() const { return this->next_; } |
| 42 | |
| 43 RawFunction* function_; | |
| 44 intptr_t token_index_; | |
| 45 intptr_t line_number_; | |
| 46 bool is_enabled_; | |
| 47 | |
| 48 SourceBreakpoint* next_; | |
| 49 | |
| 50 friend class Debugger; | |
| 51 DISALLOW_COPY_AND_ASSIGN(SourceBreakpoint); | |
| 52 }; | |
| 53 | |
| 54 | |
| 55 // CodeBreakpoint represents a location in compiled code. There may be | |
| 56 // more than one CodeBreakpoint for one SourceBreakpoint, e.g. when a | |
| 57 // function gets compiled as a regular function and as a closure. | |
| 58 class CodeBreakpoint { | |
| 59 public: | |
| 60 CodeBreakpoint(const Function& func, intptr_t pc_desc_index); | |
| 61 ~CodeBreakpoint(); | |
| 62 | |
| 63 RawFunction* function() const { return function_; } | |
| 64 uword pc() const { return pc_; } | |
| 65 intptr_t token_index() const { return token_index_; } | |
| 66 bool IsInternal() const { return src_bpt_ == NULL; } | |
| 67 | |
| 68 RawScript* SourceCode(); | |
| 69 RawString* SourceUrl(); | |
| 70 intptr_t LineNumber(); | |
| 71 | |
| 72 void Enable(); | |
| 73 void Disable(); | |
| 74 bool IsEnabled() const { return is_enabled_; } | |
|
regis
2012/03/02 17:54:53
According to our coding style, it should be is_ena
hausner
2012/03/02 18:01:19
True. I anticipate though that this function could
| |
| 75 | |
| 76 private: | |
| 77 void VisitObjectPointers(ObjectPointerVisitor* visitor); | |
| 78 | |
| 79 SourceBreakpoint* src_bpt() const { return src_bpt_; } | |
| 80 void set_src_bpt(SourceBreakpoint* value) { src_bpt_ = value; } | |
| 81 | |
| 82 void set_next(CodeBreakpoint* value) { next_ = value; } | |
| 83 CodeBreakpoint* next() const { return this->next_; } | |
| 42 intptr_t pc_desc_index() const { return pc_desc_index_; } | 84 intptr_t pc_desc_index() const { return pc_desc_index_; } |
| 43 | 85 |
| 44 void PatchCode(); | 86 void PatchCode(); |
| 45 void RestoreCode(); | 87 void RestoreCode(); |
| 46 void PatchFunctionReturn(); | 88 void PatchFunctionReturn(); |
| 47 void RestoreFunctionReturn(); | 89 void RestoreFunctionReturn(); |
| 48 | 90 |
| 49 RawFunction* function_; | 91 RawFunction* function_; |
| 50 intptr_t pc_desc_index_; | 92 intptr_t pc_desc_index_; |
| 51 intptr_t token_index_; | 93 intptr_t token_index_; |
| 52 uword pc_; | 94 uword pc_; |
| 53 intptr_t line_number_; | 95 intptr_t line_number_; |
| 54 bool is_temporary_; | 96 bool is_enabled_; |
| 55 | 97 |
| 56 bool is_patched_; | 98 SourceBreakpoint* src_bpt_; |
| 99 CodeBreakpoint* next_; | |
| 100 | |
| 57 PcDescriptors::Kind breakpoint_kind_; | 101 PcDescriptors::Kind breakpoint_kind_; |
| 58 union { | 102 union { |
| 59 uword target_address_; | 103 uword target_address_; |
| 60 uint8_t raw[2 * sizeof(uword)]; | 104 uint8_t raw[2 * sizeof(uword)]; |
| 61 } saved_bytes_; | 105 } saved_bytes_; |
| 62 | 106 |
| 63 Breakpoint* next_; | 107 friend class Debugger; |
| 108 DISALLOW_COPY_AND_ASSIGN(CodeBreakpoint); | |
| 109 }; | |
| 64 | 110 |
| 65 friend class Debugger; | 111 |
| 66 DISALLOW_COPY_AND_ASSIGN(Breakpoint); | |
| 67 }; | |
| 68 | 112 |
| 69 | 113 |
| 70 // ActivationFrame represents one dart function activation frame | 114 // ActivationFrame represents one dart function activation frame |
| 71 // on the call stack. | 115 // on the call stack. |
| 72 class ActivationFrame : public ZoneAllocated { | 116 class ActivationFrame : public ZoneAllocated { |
| 73 public: | 117 public: |
| 74 explicit ActivationFrame(uword pc, uword fp, uword sp); | 118 explicit ActivationFrame(uword pc, uword fp, uword sp); |
| 75 | 119 |
| 76 uword pc() const { return pc_; } | 120 uword pc() const { return pc_; } |
| 77 uword fp() const { return fp_; } | 121 uword fp() const { return fp_; } |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 128 } | 172 } |
| 129 private: | 173 private: |
| 130 void AddActivation(ActivationFrame* frame); | 174 void AddActivation(ActivationFrame* frame); |
| 131 ZoneGrowableArray<ActivationFrame*> trace_; | 175 ZoneGrowableArray<ActivationFrame*> trace_; |
| 132 | 176 |
| 133 friend class Debugger; | 177 friend class Debugger; |
| 134 DISALLOW_COPY_AND_ASSIGN(StackTrace); | 178 DISALLOW_COPY_AND_ASSIGN(StackTrace); |
| 135 }; | 179 }; |
| 136 | 180 |
| 137 | 181 |
| 138 typedef void BreakpointHandler(Breakpoint* bpt, StackTrace* stack); | 182 typedef void BreakpointHandler(SourceBreakpoint* bpt, StackTrace* stack); |
| 139 | 183 |
| 140 | 184 |
| 141 class Debugger { | 185 class Debugger { |
| 142 public: | 186 public: |
| 143 Debugger(); | 187 Debugger(); |
| 144 ~Debugger(); | 188 ~Debugger(); |
| 145 | 189 |
| 146 void Initialize(Isolate* isolate); | 190 void Initialize(Isolate* isolate); |
| 147 void Shutdown(); | 191 void Shutdown(); |
| 148 bool IsActive(); | 192 bool IsActive(); |
| 149 | 193 |
| 194 void NotifyCompilation(const Function& func); | |
| 195 | |
| 150 void SetBreakpointHandler(BreakpointHandler* handler); | 196 void SetBreakpointHandler(BreakpointHandler* handler); |
| 151 | 197 |
| 152 RawFunction* ResolveFunction(const Library& library, | 198 RawFunction* ResolveFunction(const Library& library, |
| 153 const String& class_name, | 199 const String& class_name, |
| 154 const String& function_name); | 200 const String& function_name); |
| 155 | 201 |
| 156 // Set breakpoint at closest location to function entry. | 202 // Set breakpoint at closest location to function entry. |
| 157 Breakpoint* SetBreakpointAtEntry(const Function& target_function, | 203 SourceBreakpoint* SetBreakpointAtEntry(const Function& target_function); |
| 158 Error* error); | 204 SourceBreakpoint* SetBreakpointAtLine(const String& script_url, |
| 159 Breakpoint* SetBreakpointAtLine(const String& script_url, | 205 intptr_t line_number); |
| 160 intptr_t line_number, | |
| 161 Error* error); | |
| 162 | 206 |
| 163 void RemoveBreakpoint(Breakpoint* bpt); | 207 void RemoveBreakpoint(SourceBreakpoint* bpt); |
| 164 | 208 |
| 165 void SetStepOver() { resume_action_ = kStepOver; } | 209 void SetStepOver() { resume_action_ = kStepOver; } |
| 166 void SetStepInto() { resume_action_ = kStepInto; } | 210 void SetStepInto() { resume_action_ = kStepInto; } |
| 167 void SetStepOut() { resume_action_ = kStepOut; } | 211 void SetStepOut() { resume_action_ = kStepOut; } |
| 168 | 212 |
| 169 void VisitObjectPointers(ObjectPointerVisitor* visitor); | 213 void VisitObjectPointers(ObjectPointerVisitor* visitor); |
| 170 | 214 |
| 171 // Returns NULL if no breakpoint exists for the given address. | |
| 172 Breakpoint* GetBreakpoint(uword breakpoint_address); | |
| 173 | |
| 174 // Called from Runtime when a breakpoint in Dart code is reached. | 215 // Called from Runtime when a breakpoint in Dart code is reached. |
| 175 void BreakpointCallback(); | 216 void BreakpointCallback(); |
| 176 | 217 |
| 177 RawArray* GetInstanceFields(const Instance& obj); | 218 RawArray* GetInstanceFields(const Instance& obj); |
| 178 RawArray* GetStaticFields(const Class& cls); | 219 RawArray* GetStaticFields(const Class& cls); |
| 179 | 220 |
| 180 // Utility functions. | 221 // Utility functions. |
| 181 static const char* QualifiedFunctionName(const Function& func); | 222 static const char* QualifiedFunctionName(const Function& func); |
| 182 | 223 |
| 183 RawObject* GetInstanceField(const Class& cls, | 224 RawObject* GetInstanceField(const Class& cls, |
| 184 const String& field_name, | 225 const String& field_name, |
| 185 const Instance& object); | 226 const Instance& object); |
| 186 RawObject* GetStaticField(const Class& cls, | 227 RawObject* GetStaticField(const Class& cls, |
| 187 const String& field_name); | 228 const String& field_name); |
| 188 | 229 |
| 189 private: | 230 private: |
| 190 enum ResumeAction { | 231 enum ResumeAction { |
| 191 kContinue, | 232 kContinue, |
| 192 kStepOver, | 233 kStepOver, |
| 193 kStepInto, | 234 kStepInto, |
| 194 kStepOut | 235 kStepOut |
| 195 }; | 236 }; |
| 196 | 237 |
| 197 void InstrumentForStepping(const Function &target_function); | 238 void InstrumentForStepping(const Function &target_function); |
| 198 Breakpoint* SetBreakpoint(const Function& target_function, | 239 SourceBreakpoint* SetBreakpoint(const Function& target_function, |
| 199 intptr_t token_index, | 240 intptr_t token_index); |
| 200 Error* error); | 241 void RemoveInternalBreakpoints(); |
| 201 void UnsetBreakpoint(Breakpoint* bpt); | 242 void RemoveCodeBreakpoints(SourceBreakpoint* src_bpt); |
| 202 void RemoveTemporaryBreakpoints(); | 243 void RegisterSourceBreakpoint(SourceBreakpoint* bpt); |
| 203 Breakpoint* NewBreakpoint(const Function& func, intptr_t pc_desc_index); | 244 void RegisterCodeBreakpoint(CodeBreakpoint* bpt); |
| 204 void RegisterBreakpoint(Breakpoint* bpt); | 245 SourceBreakpoint* GetSourceBreakpoint(const Function& func, |
| 205 Breakpoint* GetBreakpointByFunction(const Function& func, | 246 intptr_t token_index); |
| 206 intptr_t token_index); | 247 CodeBreakpoint* MakeCodeBreakpoint(SourceBreakpoint* src_bpt); |
| 248 | |
| 249 // Returns NULL if no breakpoint exists for the given address. | |
| 250 CodeBreakpoint* GetCodeBreakpoint(uword breakpoint_address); | |
| 251 | |
| 252 void SyncBreakpoint(SourceBreakpoint* bpt); | |
| 207 | 253 |
| 208 Isolate* isolate_; | 254 Isolate* isolate_; |
| 209 bool initialized_; | 255 bool initialized_; |
| 210 BreakpointHandler* bp_handler_; | 256 BreakpointHandler* bp_handler_; |
| 211 Breakpoint* breakpoints_; | 257 SourceBreakpoint* src_breakpoints_; |
| 258 CodeBreakpoint* code_breakpoints_; | |
| 212 | 259 |
| 213 // Tells debugger what to do when resuming execution after a breakpoint. | 260 // Tells debugger what to do when resuming execution after a breakpoint. |
| 214 ResumeAction resume_action_; | 261 ResumeAction resume_action_; |
| 215 | 262 |
| 263 friend class SourceBreakpoint; | |
| 216 DISALLOW_COPY_AND_ASSIGN(Debugger); | 264 DISALLOW_COPY_AND_ASSIGN(Debugger); |
| 217 }; | 265 }; |
| 218 | 266 |
| 219 | 267 |
| 220 } // namespace dart | 268 } // namespace dart |
| 221 | 269 |
| 222 #endif // VM_DEBUGGER_H_ | 270 #endif // VM_DEBUGGER_H_ |
| OLD | NEW |