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 VM_DEBUGGER_H_ | 5 #ifndef VM_DEBUGGER_H_ |
6 #define VM_DEBUGGER_H_ | 6 #define VM_DEBUGGER_H_ |
7 | 7 |
8 #include "include/dart_debugger_api.h" | 8 #include "include/dart_debugger_api.h" |
9 | 9 |
10 #include "vm/object.h" | 10 #include "vm/object.h" |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 | 259 |
260 // Set breakpoint at closest location to function entry. | 260 // Set breakpoint at closest location to function entry. |
261 SourceBreakpoint* SetBreakpointAtEntry(const Function& target_function); | 261 SourceBreakpoint* SetBreakpointAtEntry(const Function& target_function); |
262 SourceBreakpoint* SetBreakpointAtLine(const String& script_url, | 262 SourceBreakpoint* SetBreakpointAtLine(const String& script_url, |
263 intptr_t line_number); | 263 intptr_t line_number); |
264 void OneTimeBreakAtEntry(const Function& target_function); | 264 void OneTimeBreakAtEntry(const Function& target_function); |
265 | 265 |
266 void RemoveBreakpoint(intptr_t bp_id); | 266 void RemoveBreakpoint(intptr_t bp_id); |
267 SourceBreakpoint* GetBreakpointById(intptr_t id); | 267 SourceBreakpoint* GetBreakpointById(intptr_t id); |
268 | 268 |
269 void SetStepOver() { resume_action_ = kStepOver; } | 269 void SetStepOver(); |
270 void SetStepInto() { resume_action_ = kStepInto; } | 270 void SetSingleStep(); |
271 void SetStepOut() { resume_action_ = kStepOut; } | 271 void SetStepOut(); |
| 272 bool IsStepping() const { return resume_action_ != kContinue; } |
272 | 273 |
273 void SetExceptionPauseInfo(Dart_ExceptionPauseInfo pause_info); | 274 void SetExceptionPauseInfo(Dart_ExceptionPauseInfo pause_info); |
274 Dart_ExceptionPauseInfo GetExceptionPauseInfo(); | 275 Dart_ExceptionPauseInfo GetExceptionPauseInfo(); |
275 | 276 |
276 void VisitObjectPointers(ObjectPointerVisitor* visitor); | 277 void VisitObjectPointers(ObjectPointerVisitor* visitor); |
277 | 278 |
278 // Called from Runtime when a breakpoint in Dart code is reached. | 279 // Called from Runtime when a breakpoint in Dart code is reached. |
279 void BreakpointCallback(); | 280 void BreakpointCallback(); |
280 | 281 |
281 // Returns true if there is at least one breakpoint set in func. | 282 // Returns true if there is at least one breakpoint set in func. |
282 // Checks for both user-defined and internal temporary breakpoints. | 283 // Checks for both user-defined and internal temporary breakpoints. |
283 bool HasBreakpoint(const Function& func); | 284 bool HasBreakpoint(const Function& func); |
284 | 285 |
285 DebuggerStackTrace* StackTrace() const { return stack_trace_; } | 286 DebuggerStackTrace* StackTrace(); |
286 | 287 |
287 RawArray* GetInstanceFields(const Instance& obj); | 288 RawArray* GetInstanceFields(const Instance& obj); |
288 RawArray* GetStaticFields(const Class& cls); | 289 RawArray* GetStaticFields(const Class& cls); |
289 RawArray* GetLibraryFields(const Library& lib); | 290 RawArray* GetLibraryFields(const Library& lib); |
290 RawArray* GetGlobalFields(const Library& lib); | 291 RawArray* GetGlobalFields(const Library& lib); |
291 | 292 |
292 intptr_t CacheObject(const Object& obj); | 293 intptr_t CacheObject(const Object& obj); |
293 RawObject* GetCachedObject(intptr_t obj_id); | 294 RawObject* GetCachedObject(intptr_t obj_id); |
294 bool IsValidObjectId(intptr_t obj_id); | 295 bool IsValidObjectId(intptr_t obj_id); |
295 | 296 |
296 Dart_Port GetIsolateId() { return isolate_id_; } | 297 Dart_Port GetIsolateId() { return isolate_id_; } |
297 | 298 |
298 static void SetEventHandler(EventHandler* handler); | 299 static void SetEventHandler(EventHandler* handler); |
299 | 300 |
300 // Utility functions. | 301 // Utility functions. |
301 static const char* QualifiedFunctionName(const Function& func); | 302 static const char* QualifiedFunctionName(const Function& func); |
302 | 303 |
303 RawObject* GetInstanceField(const Class& cls, | 304 RawObject* GetInstanceField(const Class& cls, |
304 const String& field_name, | 305 const String& field_name, |
305 const Instance& object); | 306 const Instance& object); |
306 RawObject* GetStaticField(const Class& cls, | 307 RawObject* GetStaticField(const Class& cls, |
307 const String& field_name); | 308 const String& field_name); |
308 | 309 |
309 void SignalBpReached(); | 310 void SignalBpReached(); |
| 311 void SingleStepCallback(); |
| 312 |
310 void SignalExceptionThrown(const Instance& exc); | 313 void SignalExceptionThrown(const Instance& exc); |
311 static void SignalIsolateEvent(EventType type); | 314 static void SignalIsolateEvent(EventType type); |
312 | 315 |
313 uword GetPatchedStubAddress(uword breakpoint_address); | 316 uword GetPatchedStubAddress(uword breakpoint_address); |
314 | 317 |
315 private: | 318 private: |
316 enum ResumeAction { | 319 enum ResumeAction { |
317 kContinue, | 320 kContinue, |
318 kStepOver, | 321 kStepOver, |
319 kStepInto, | 322 kStepOut, |
320 kStepOut | 323 kSingleStep |
321 }; | 324 }; |
322 | 325 |
323 intptr_t ResolveBreakpointPos(const Function& func, | 326 intptr_t ResolveBreakpointPos(const Function& func, |
324 intptr_t first_token_pos, | 327 intptr_t first_token_pos, |
325 intptr_t last_token_pos); | 328 intptr_t last_token_pos); |
326 void DeoptimizeWorld(); | 329 void DeoptimizeWorld(); |
327 void InstrumentForStepping(const Function& target_function); | 330 void InstrumentForStepping(const Function& target_function); |
328 SourceBreakpoint* SetBreakpoint(const Function& target_function, | 331 SourceBreakpoint* SetBreakpoint(const Function& target_function, |
329 intptr_t first_token_pos, | 332 intptr_t first_token_pos, |
330 intptr_t last_token_pos); | 333 intptr_t last_token_pos); |
331 void RemoveInternalBreakpoints(); | 334 void RemoveInternalBreakpoints(); |
332 void UnlinkCodeBreakpoints(SourceBreakpoint* src_bpt); | 335 void UnlinkCodeBreakpoints(SourceBreakpoint* src_bpt); |
333 void RegisterSourceBreakpoint(SourceBreakpoint* bpt); | 336 void RegisterSourceBreakpoint(SourceBreakpoint* bpt); |
334 void RegisterCodeBreakpoint(CodeBreakpoint* bpt); | 337 void RegisterCodeBreakpoint(CodeBreakpoint* bpt); |
335 SourceBreakpoint* GetSourceBreakpoint(const Function& func, | 338 SourceBreakpoint* GetSourceBreakpoint(const Function& func, |
336 intptr_t token_pos); | 339 intptr_t token_pos); |
337 void MakeCodeBreakpointsAt(const Function& func, | 340 void MakeCodeBreakpointsAt(const Function& func, |
338 intptr_t token_pos, | 341 intptr_t token_pos, |
339 SourceBreakpoint* bpt); | 342 SourceBreakpoint* bpt); |
340 // Returns NULL if no breakpoint exists for the given address. | 343 // Returns NULL if no breakpoint exists for the given address. |
341 CodeBreakpoint* GetCodeBreakpoint(uword breakpoint_address); | 344 CodeBreakpoint* GetCodeBreakpoint(uword breakpoint_address); |
342 | 345 |
343 void SyncBreakpoint(SourceBreakpoint* bpt); | 346 void SyncBreakpoint(SourceBreakpoint* bpt); |
344 | 347 |
| 348 ActivationFrame* TopDartFrame() const; |
345 static DebuggerStackTrace* CollectStackTrace(); | 349 static DebuggerStackTrace* CollectStackTrace(); |
346 void SignalBpResolved(SourceBreakpoint *bpt); | 350 void SignalBpResolved(SourceBreakpoint *bpt); |
| 351 void SignalPausedEvent(ActivationFrame* top_frame); |
347 | 352 |
348 bool IsDebuggable(const Function& func); | 353 bool IsDebuggable(const Function& func); |
349 | 354 |
350 intptr_t nextId() { return next_id_++; } | 355 intptr_t nextId() { return next_id_++; } |
351 | 356 |
352 bool ShouldPauseOnException(DebuggerStackTrace* stack_trace, | 357 bool ShouldPauseOnException(DebuggerStackTrace* stack_trace, |
353 const Instance& exc); | 358 const Instance& exc); |
354 | 359 |
355 void CollectLibraryFields(const GrowableObjectArray& field_list, | 360 void CollectLibraryFields(const GrowableObjectArray& field_list, |
356 const Library& lib, | 361 const Library& lib, |
(...skipping 16 matching lines...) Expand all Loading... |
373 CodeBreakpoint* code_breakpoints_; | 378 CodeBreakpoint* code_breakpoints_; |
374 | 379 |
375 // Tells debugger what to do when resuming execution after a breakpoint. | 380 // Tells debugger what to do when resuming execution after a breakpoint. |
376 ResumeAction resume_action_; | 381 ResumeAction resume_action_; |
377 | 382 |
378 // Do not call back to breakpoint handler if this flag is set. | 383 // Do not call back to breakpoint handler if this flag is set. |
379 // Effectively this means ignoring breakpoints. Set when Dart code may | 384 // Effectively this means ignoring breakpoints. Set when Dart code may |
380 // be run as a side effect of getting values of fields. | 385 // be run as a side effect of getting values of fields. |
381 bool ignore_breakpoints_; | 386 bool ignore_breakpoints_; |
382 | 387 |
| 388 // True while debugger calls event_handler_. Used to prevent recursive |
| 389 // debugger events. |
| 390 bool in_event_notification_; |
| 391 |
383 Dart_ExceptionPauseInfo exc_pause_info_; | 392 Dart_ExceptionPauseInfo exc_pause_info_; |
384 | 393 |
385 static BreakpointHandler* bp_handler_; | |
386 static EventHandler* event_handler_; | 394 static EventHandler* event_handler_; |
387 | 395 |
388 friend class Isolate; | 396 friend class Isolate; |
389 friend class SourceBreakpoint; | 397 friend class SourceBreakpoint; |
390 DISALLOW_COPY_AND_ASSIGN(Debugger); | 398 DISALLOW_COPY_AND_ASSIGN(Debugger); |
391 }; | 399 }; |
392 | 400 |
393 | 401 |
394 } // namespace dart | 402 } // namespace dart |
395 | 403 |
396 #endif // VM_DEBUGGER_H_ | 404 #endif // VM_DEBUGGER_H_ |
OLD | NEW |