Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(169)

Side by Side Diff: runtime/vm/debugger.h

Issue 2692803006: Track the 'awaiter return' call stack use it to detect uncaught exceptions in async functions (Closed)
Patch Set: rmacnak review Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 253
254 254
255 // ActivationFrame represents one dart function activation frame 255 // ActivationFrame represents one dart function activation frame
256 // on the call stack. 256 // on the call stack.
257 class ActivationFrame : public ZoneAllocated { 257 class ActivationFrame : public ZoneAllocated {
258 public: 258 public:
259 enum Kind { 259 enum Kind {
260 kRegular, 260 kRegular,
261 kAsyncSuspensionMarker, 261 kAsyncSuspensionMarker,
262 kAsyncCausal, 262 kAsyncCausal,
263 kAsyncActivation,
263 }; 264 };
264 265
265 ActivationFrame(uword pc, 266 ActivationFrame(uword pc,
266 uword fp, 267 uword fp,
267 uword sp, 268 uword sp,
268 const Code& code, 269 const Code& code,
269 const Array& deopt_frame, 270 const Array& deopt_frame,
270 intptr_t deopt_frame_offset, 271 intptr_t deopt_frame_offset,
271 Kind kind = kRegular); 272 Kind kind = kRegular);
272 273
273 ActivationFrame(uword pc, const Code& code); 274 ActivationFrame(uword pc, const Code& code);
274 275
275 explicit ActivationFrame(Kind kind); 276 explicit ActivationFrame(Kind kind);
276 277
278 explicit ActivationFrame(const Closure& async_activation);
279
277 uword pc() const { return pc_; } 280 uword pc() const { return pc_; }
278 uword fp() const { return fp_; } 281 uword fp() const { return fp_; }
279 uword sp() const { return sp_; } 282 uword sp() const { return sp_; }
280 const Function& function() const { 283 const Function& function() const {
281 ASSERT(!function_.IsNull()); 284 ASSERT(!function_.IsNull());
282 return function_; 285 return function_;
283 } 286 }
284 const Code& code() const { 287 const Code& code() const {
285 ASSERT(!code_.IsNull()); 288 ASSERT(!code_.IsNull());
286 return code_; 289 return code_;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 const Context& GetSavedCurrentContext(); 328 const Context& GetSavedCurrentContext();
326 RawObject* GetAsyncOperation(); 329 RawObject* GetAsyncOperation();
327 330
328 RawObject* Evaluate(const String& expr); 331 RawObject* Evaluate(const String& expr);
329 332
330 // Print the activation frame into |jsobj|. if |full| is false, script 333 // Print the activation frame into |jsobj|. if |full| is false, script
331 // and local variable objects are only references. if |full| is true, 334 // and local variable objects are only references. if |full| is true,
332 // the complete script, function, and, local variable objects are included. 335 // the complete script, function, and, local variable objects are included.
333 void PrintToJSONObject(JSONObject* jsobj, bool full = false); 336 void PrintToJSONObject(JSONObject* jsobj, bool full = false);
334 337
338 RawObject* GetAsyncAwaiter();
339
340 bool HandlesException(const Instance& exc_obj);
341
335 private: 342 private:
336 void PrintToJSONObjectRegular(JSONObject* jsobj, bool full); 343 void PrintToJSONObjectRegular(JSONObject* jsobj, bool full);
337 void PrintToJSONObjectAsyncCausal(JSONObject* jsobj, bool full); 344 void PrintToJSONObjectAsyncCausal(JSONObject* jsobj, bool full);
338 void PrintToJSONObjectAsyncSuspensionMarker(JSONObject* jsobj, bool full); 345 void PrintToJSONObjectAsyncSuspensionMarker(JSONObject* jsobj, bool full);
339 346
340 void PrintContextMismatchError(intptr_t ctx_slot, 347 void PrintContextMismatchError(intptr_t ctx_slot,
341 intptr_t frame_ctx_level, 348 intptr_t frame_ctx_level,
342 intptr_t var_ctx_level); 349 intptr_t var_ctx_level);
343 350
344 intptr_t TryIndex(); 351 intptr_t TryIndex();
345 void GetPcDescriptors(); 352 void GetPcDescriptors();
346 void GetVarDescriptors(); 353 void GetVarDescriptors();
347 void GetDescIndices(); 354 void GetDescIndices();
348 355
356 RawObject* GetAsyncStreamControllerStreamAwaiter(const Object& stream);
357 RawObject* GetAsyncStreamControllerStream();
358 RawObject* GetAsyncCompleterAwaiter(const Object& completer);
359 RawObject* GetAsyncCompleter();
360 void ExtractTokenPositionFromAsyncClosure();
361
349 static const char* KindToCString(Kind kind) { 362 static const char* KindToCString(Kind kind) {
350 switch (kind) { 363 switch (kind) {
351 case kRegular: 364 case kRegular:
352 return "Regular"; 365 return "Regular";
353 case kAsyncCausal: 366 case kAsyncCausal:
354 return "AsyncCausal"; 367 return "AsyncCausal";
355 case kAsyncSuspensionMarker: 368 case kAsyncSuspensionMarker:
356 return "AsyncSuspensionMarker"; 369 return "AsyncSuspensionMarker";
357 default: 370 default:
358 UNREACHABLE(); 371 UNREACHABLE();
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 BreakpointLocation* GetBreakpointLocation(const Script& script, 633 BreakpointLocation* GetBreakpointLocation(const Script& script,
621 TokenPosition token_pos, 634 TokenPosition token_pos,
622 intptr_t requested_column); 635 intptr_t requested_column);
623 void MakeCodeBreakpointAt(const Function& func, BreakpointLocation* bpt); 636 void MakeCodeBreakpointAt(const Function& func, BreakpointLocation* bpt);
624 // Returns NULL if no breakpoint exists for the given address. 637 // Returns NULL if no breakpoint exists for the given address.
625 CodeBreakpoint* GetCodeBreakpoint(uword breakpoint_address); 638 CodeBreakpoint* GetCodeBreakpoint(uword breakpoint_address);
626 639
627 void SyncBreakpointLocation(BreakpointLocation* loc); 640 void SyncBreakpointLocation(BreakpointLocation* loc);
628 641
629 ActivationFrame* TopDartFrame() const; 642 ActivationFrame* TopDartFrame() const;
630 static ActivationFrame* CollectDartFrame(Isolate* isolate, 643 static ActivationFrame* CollectDartFrame(
631 uword pc, 644 Isolate* isolate,
632 StackFrame* frame, 645 uword pc,
633 const Code& code, 646 StackFrame* frame,
634 const Array& deopt_frame, 647 const Code& code,
635 intptr_t deopt_frame_offset); 648 const Array& deopt_frame,
649 intptr_t deopt_frame_offset,
650 ActivationFrame::Kind kind = ActivationFrame::kRegular);
636 static RawArray* DeoptimizeToArray(Thread* thread, 651 static RawArray* DeoptimizeToArray(Thread* thread,
637 StackFrame* frame, 652 StackFrame* frame,
638 const Code& code); 653 const Code& code);
639 // Appends at least one stack frame. Multiple frames will be appended 654 // Appends at least one stack frame. Multiple frames will be appended
640 // if |code| at the frame's pc contains inlined functions. 655 // if |code| at the frame's pc contains inlined functions.
641 static void AppendCodeFrames(Thread* thread, 656 static void AppendCodeFrames(Thread* thread,
642 Isolate* isolate, 657 Isolate* isolate,
643 Zone* zone, 658 Zone* zone,
644 DebuggerStackTrace* stack_trace, 659 DebuggerStackTrace* stack_trace,
645 StackFrame* frame, 660 StackFrame* frame,
646 Code* code, 661 Code* code,
647 Code* inlined_code, 662 Code* inlined_code,
648 Array* deopt_frame); 663 Array* deopt_frame);
649 static DebuggerStackTrace* CollectStackTrace(); 664 static DebuggerStackTrace* CollectStackTrace();
650 static DebuggerStackTrace* CollectAsyncCausalStackTrace(); 665 static DebuggerStackTrace* CollectAsyncCausalStackTrace();
666 static DebuggerStackTrace* CollectAwaiterReturnStackTrace();
651 void SignalPausedEvent(ActivationFrame* top_frame, Breakpoint* bpt); 667 void SignalPausedEvent(ActivationFrame* top_frame, Breakpoint* bpt);
652 668
653 intptr_t nextId() { return next_id_++; } 669 intptr_t nextId() { return next_id_++; }
654 670
671 bool ShouldPauseOnAsyncException(DebuggerStackTrace* stack_trace,
672 const Instance& exc);
673
655 bool ShouldPauseOnException(DebuggerStackTrace* stack_trace, 674 bool ShouldPauseOnException(DebuggerStackTrace* stack_trace,
656 const Instance& exc); 675 const Instance& exc);
657 676
658 void CollectLibraryFields(const GrowableObjectArray& field_list, 677 void CollectLibraryFields(const GrowableObjectArray& field_list,
659 const Library& lib, 678 const Library& lib,
660 const String& prefix, 679 const String& prefix,
661 bool include_private_fields); 680 bool include_private_fields);
662 681
663 // Handles any events which pause vm execution. Breakpoints, 682 // Handles any events which pause vm execution. Breakpoints,
664 // interrupts, etc. 683 // interrupts, etc.
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 757
739 friend class Isolate; 758 friend class Isolate;
740 friend class BreakpointLocation; 759 friend class BreakpointLocation;
741 DISALLOW_COPY_AND_ASSIGN(Debugger); 760 DISALLOW_COPY_AND_ASSIGN(Debugger);
742 }; 761 };
743 762
744 763
745 } // namespace dart 764 } // namespace dart
746 765
747 #endif // RUNTIME_VM_DEBUGGER_H_ 766 #endif // RUNTIME_VM_DEBUGGER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698