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

Side by Side Diff: src/debug/debug.h

Issue 2664793002: [debugger] account for inlined functions when stepping. (Closed)
Patch Set: Created 3 years, 10 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
« no previous file with comments | « no previous file | src/debug/debug.cc » ('j') | src/debug/debug.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_DEBUG_DEBUG_H_ 5 #ifndef V8_DEBUG_DEBUG_H_
6 #define V8_DEBUG_DEBUG_H_ 6 #define V8_DEBUG_DEBUG_H_
7 7
8 #include "src/allocation.h" 8 #include "src/allocation.h"
9 #include "src/arguments.h" 9 #include "src/arguments.h"
10 #include "src/assembler.h" 10 #include "src/assembler.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 LastStepAction = StepIn 43 LastStepAction = StepIn
44 }; 44 };
45 45
46 // Type of exception break. NOTE: These values are in macros.py as well. 46 // Type of exception break. NOTE: These values are in macros.py as well.
47 enum ExceptionBreakType { 47 enum ExceptionBreakType {
48 BreakException = 0, 48 BreakException = 0,
49 BreakUncaughtException = 1 49 BreakUncaughtException = 1
50 }; 50 };
51 51
52 52
53 // Type of exception break.
54 enum BreakLocatorType { ALL_BREAK_LOCATIONS, CALLS_AND_RETURNS };
55
56
57 // The different types of breakpoint position alignments. 53 // The different types of breakpoint position alignments.
58 // Must match Debug.BreakPositionAlignment in debug.js 54 // Must match Debug.BreakPositionAlignment in debug.js
59 enum BreakPositionAlignment { 55 enum BreakPositionAlignment {
60 STATEMENT_ALIGNED = 0, 56 STATEMENT_ALIGNED = 0,
61 BREAK_POSITION_ALIGNED = 1 57 BREAK_POSITION_ALIGNED = 1
62 }; 58 };
63 59
64 enum DebugBreakType { 60 enum DebugBreakType {
65 NOT_DEBUG_BREAK, 61 NOT_DEBUG_BREAK,
66 DEBUGGER_STATEMENT, 62 DEBUGGER_STATEMENT,
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 DebugBreakType type_; 111 DebugBreakType type_;
116 int position_; 112 int position_;
117 113
118 friend class CodeBreakIterator; 114 friend class CodeBreakIterator;
119 friend class BytecodeArrayBreakIterator; 115 friend class BytecodeArrayBreakIterator;
120 }; 116 };
121 117
122 class BreakIterator { 118 class BreakIterator {
123 public: 119 public:
124 static std::unique_ptr<BreakIterator> GetIterator( 120 static std::unique_ptr<BreakIterator> GetIterator(
125 Handle<DebugInfo> debug_info, Handle<AbstractCode> abstract_code, 121 Handle<DebugInfo> debug_info, Handle<AbstractCode> abstract_code);
126 BreakLocatorType type = ALL_BREAK_LOCATIONS);
127 122
128 virtual ~BreakIterator() {} 123 virtual ~BreakIterator() {}
129 124
130 virtual BreakLocation GetBreakLocation() = 0; 125 virtual BreakLocation GetBreakLocation() = 0;
131 virtual bool Done() const = 0; 126 virtual bool Done() const = 0;
132 virtual void Next() = 0; 127 virtual void Next() = 0;
133 128
134 void SkipTo(int count) { 129 void SkipTo(int count) {
135 while (count-- > 0) Next(); 130 while (count-- > 0) Next();
136 } 131 }
137 132
138 virtual int code_offset() = 0; 133 virtual int code_offset() = 0;
139 int break_index() const { return break_index_; } 134 int break_index() const { return break_index_; }
140 inline int position() const { return position_; } 135 inline int position() const { return position_; }
141 inline int statement_position() const { return statement_position_; } 136 inline int statement_position() const { return statement_position_; }
142 137
143 virtual bool IsDebugBreak() = 0; 138 virtual bool IsDebugBreak() = 0;
144 virtual void ClearDebugBreak() = 0; 139 virtual void ClearDebugBreak() = 0;
145 virtual void SetDebugBreak() = 0; 140 virtual void SetDebugBreak() = 0;
146 141
147 protected: 142 protected:
148 explicit BreakIterator(Handle<DebugInfo> debug_info, 143 explicit BreakIterator(Handle<DebugInfo> debug_info);
149 BreakLocatorType break_locator_type);
150 144
151 int BreakIndexFromPosition(int position, BreakPositionAlignment alignment); 145 int BreakIndexFromPosition(int position, BreakPositionAlignment alignment);
152 146
153 Isolate* isolate() { return debug_info_->GetIsolate(); } 147 Isolate* isolate() { return debug_info_->GetIsolate(); }
154 148
155 Handle<DebugInfo> debug_info_; 149 Handle<DebugInfo> debug_info_;
156 int break_index_; 150 int break_index_;
157 int position_; 151 int position_;
158 int statement_position_; 152 int statement_position_;
159 BreakLocatorType break_locator_type_;
160 153
161 private: 154 private:
162 DisallowHeapAllocation no_gc_; 155 DisallowHeapAllocation no_gc_;
163 DISALLOW_COPY_AND_ASSIGN(BreakIterator); 156 DISALLOW_COPY_AND_ASSIGN(BreakIterator);
164 }; 157 };
165 158
166 class CodeBreakIterator : public BreakIterator { 159 class CodeBreakIterator : public BreakIterator {
167 public: 160 public:
168 CodeBreakIterator(Handle<DebugInfo> debug_info, BreakLocatorType type); 161 explicit CodeBreakIterator(Handle<DebugInfo> debug_info);
169 ~CodeBreakIterator() override {} 162 ~CodeBreakIterator() override {}
170 163
171 BreakLocation GetBreakLocation() override; 164 BreakLocation GetBreakLocation() override;
172 bool Done() const override { return reloc_iterator_.done(); } 165 bool Done() const override { return reloc_iterator_.done(); }
173 void Next() override; 166 void Next() override;
174 167
175 bool IsDebugBreak() override; 168 bool IsDebugBreak() override;
176 void ClearDebugBreak() override; 169 void ClearDebugBreak() override;
177 void SetDebugBreak() override; 170 void SetDebugBreak() override;
178 171
179 void SkipToPosition(int position, BreakPositionAlignment alignment); 172 void SkipToPosition(int position, BreakPositionAlignment alignment);
180 173
181 int code_offset() override { 174 int code_offset() override {
182 return static_cast<int>(rinfo()->pc() - 175 return static_cast<int>(rinfo()->pc() -
183 debug_info_->DebugCode()->instruction_start()); 176 debug_info_->DebugCode()->instruction_start());
184 } 177 }
185 178
186 private: 179 private:
187 int GetModeMask(BreakLocatorType type); 180 int GetModeMask();
188 DebugBreakType GetDebugBreakType(); 181 DebugBreakType GetDebugBreakType();
189 182
190 RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); } 183 RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); }
191 RelocInfo* rinfo() { return reloc_iterator_.rinfo(); } 184 RelocInfo* rinfo() { return reloc_iterator_.rinfo(); }
192 185
193 RelocIterator reloc_iterator_; 186 RelocIterator reloc_iterator_;
194 SourcePositionTableIterator source_position_iterator_; 187 SourcePositionTableIterator source_position_iterator_;
195 DISALLOW_COPY_AND_ASSIGN(CodeBreakIterator); 188 DISALLOW_COPY_AND_ASSIGN(CodeBreakIterator);
196 }; 189 };
197 190
198 class BytecodeArrayBreakIterator : public BreakIterator { 191 class BytecodeArrayBreakIterator : public BreakIterator {
199 public: 192 public:
200 BytecodeArrayBreakIterator(Handle<DebugInfo> debug_info, 193 explicit BytecodeArrayBreakIterator(Handle<DebugInfo> debug_info);
201 BreakLocatorType type);
202 ~BytecodeArrayBreakIterator() override {} 194 ~BytecodeArrayBreakIterator() override {}
203 195
204 BreakLocation GetBreakLocation() override; 196 BreakLocation GetBreakLocation() override;
205 bool Done() const override { return source_position_iterator_.done(); } 197 bool Done() const override { return source_position_iterator_.done(); }
206 void Next() override; 198 void Next() override;
207 199
208 bool IsDebugBreak() override; 200 bool IsDebugBreak() override;
209 void ClearDebugBreak() override; 201 void ClearDebugBreak() override;
210 void SetDebugBreak() override; 202 void SetDebugBreak() override;
211 203
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 void RunPromiseHook(PromiseHookType type, Handle<JSPromise> promise, 344 void RunPromiseHook(PromiseHookType type, Handle<JSPromise> promise,
353 Handle<Object> parent); 345 Handle<Object> parent);
354 346
355 int NextAsyncTaskId(Handle<JSObject> promise); 347 int NextAsyncTaskId(Handle<JSObject> promise);
356 348
357 bool IsBlackboxed(Handle<SharedFunctionInfo> shared); 349 bool IsBlackboxed(Handle<SharedFunctionInfo> shared);
358 350
359 void SetDebugDelegate(debug::DebugDelegate* delegate); 351 void SetDebugDelegate(debug::DebugDelegate* delegate);
360 352
361 // Returns whether the operation succeeded. Compilation can only be triggered 353 // Returns whether the operation succeeded. Compilation can only be triggered
362 // if a valid closure is passed as the second argument, otherwise the shared 354 // if a valid closure is passed as the second argument, otherwise the shared
jgruber 2017/01/30 15:42:17 Comment seems outdated.
363 // function needs to be compiled already. 355 // function needs to be compiled already.
364 bool EnsureDebugInfo(Handle<SharedFunctionInfo> shared, 356 bool EnsureDebugInfo(Handle<SharedFunctionInfo> shared);
365 Handle<JSFunction> function);
366 void CreateDebugInfo(Handle<SharedFunctionInfo> shared); 357 void CreateDebugInfo(Handle<SharedFunctionInfo> shared);
367 static Handle<DebugInfo> GetDebugInfo(Handle<SharedFunctionInfo> shared); 358 static Handle<DebugInfo> GetDebugInfo(Handle<SharedFunctionInfo> shared);
368 359
369 template <typename C> 360 template <typename C>
370 bool CompileToRevealInnerFunctions(C* compilable); 361 bool CompileToRevealInnerFunctions(C* compilable);
371 362
372 // This function is used in FunctionNameUsing* tests. 363 // This function is used in FunctionNameUsing* tests.
373 Handle<Object> FindSharedFunctionInfoInScript(Handle<Script> script, 364 Handle<Object> FindSharedFunctionInfoInScript(Handle<Script> script,
374 int position); 365 int position);
375 366
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 private: 454 private:
464 explicit Debug(Isolate* isolate); 455 explicit Debug(Isolate* isolate);
465 456
466 void UpdateState(); 457 void UpdateState();
467 void UpdateHookOnFunctionCall(); 458 void UpdateHookOnFunctionCall();
468 void Unload(); 459 void Unload();
469 void SetNextBreakId() { 460 void SetNextBreakId() {
470 thread_local_.break_id_ = ++thread_local_.break_count_; 461 thread_local_.break_id_ = ++thread_local_.break_count_;
471 } 462 }
472 463
464 // Return the number of virtual frames below debugger entry.
465 int CurrentFrameCount();
466
473 inline bool ignore_events() const { 467 inline bool ignore_events() const {
474 return is_suppressed_ || !is_active_ || isolate_->needs_side_effect_check(); 468 return is_suppressed_ || !is_active_ || isolate_->needs_side_effect_check();
475 } 469 }
476 inline bool break_disabled() const { 470 inline bool break_disabled() const {
477 return break_disabled_ || in_debug_event_listener_; 471 return break_disabled_ || in_debug_event_listener_;
478 } 472 }
479 473
480 void clear_suspended_generator() { 474 void clear_suspended_generator() {
481 thread_local_.suspended_generator_ = Smi::kZero; 475 thread_local_.suspended_generator_ = Smi::kZero;
482 } 476 }
483 477
484 bool has_suspended_generator() const { 478 bool has_suspended_generator() const {
485 return thread_local_.suspended_generator_ != Smi::kZero; 479 return thread_local_.suspended_generator_ != Smi::kZero;
486 } 480 }
487 481
488 // There are three types of event listeners: C++ message_handler, 482 // There are three types of event listeners: C++ message_handler,
489 // JavaScript event listener and C++ event listener. 483 // JavaScript event listener and C++ event listener.
490 // Currently inspector still uses C++ event listener and installs 484 // Currently inspector still uses C++ event listener and installs
491 // more specific event listeners for part of events. Calling of 485 // more specific event listeners for part of events. Calling of
492 // C++ event listener is redundant when more specific event listener 486 // C++ event listener is redundant when more specific event listener
493 // is presented. Other clients can install JavaScript event listener 487 // is presented. Other clients can install JavaScript event listener
494 // (e.g. some of NodeJS module). 488 // (e.g. some of NodeJS module).
495 bool non_inspector_listener_exists() const { 489 bool non_inspector_listener_exists() const {
496 return !event_listener_.is_null() && !event_listener_->IsForeign(); 490 return !event_listener_.is_null() && !event_listener_->IsForeign();
497 } 491 }
498 492
499 bool IsBlackboxed(SharedFunctionInfo* shared);
500 bool IsExceptionBlackboxed(bool uncaught); 493 bool IsExceptionBlackboxed(bool uncaught);
501 494
502 void OnException(Handle<Object> exception, Handle<Object> promise); 495 void OnException(Handle<Object> exception, Handle<Object> promise);
503 496
504 // Constructors for debug event objects. 497 // Constructors for debug event objects.
505 MUST_USE_RESULT MaybeHandle<Object> MakeExecutionState(); 498 MUST_USE_RESULT MaybeHandle<Object> MakeExecutionState();
506 MUST_USE_RESULT MaybeHandle<Object> MakeBreakEvent( 499 MUST_USE_RESULT MaybeHandle<Object> MakeBreakEvent(
507 Handle<Object> break_points_hit); 500 Handle<Object> break_points_hit);
508 MUST_USE_RESULT MaybeHandle<Object> MakeExceptionEvent( 501 MUST_USE_RESULT MaybeHandle<Object> MakeExceptionEvent(
509 Handle<Object> exception, 502 Handle<Object> exception,
(...skipping 13 matching lines...) Expand all
523 // Find the closest source position for a break point for a given position. 516 // Find the closest source position for a break point for a given position.
524 int FindBreakablePosition(Handle<DebugInfo> debug_info, int source_position, 517 int FindBreakablePosition(Handle<DebugInfo> debug_info, int source_position,
525 BreakPositionAlignment alignment); 518 BreakPositionAlignment alignment);
526 // Instrument code to break at break points. 519 // Instrument code to break at break points.
527 void ApplyBreakPoints(Handle<DebugInfo> debug_info); 520 void ApplyBreakPoints(Handle<DebugInfo> debug_info);
528 // Clear code from instrumentation. 521 // Clear code from instrumentation.
529 void ClearBreakPoints(Handle<DebugInfo> debug_info); 522 void ClearBreakPoints(Handle<DebugInfo> debug_info);
530 // Clear all code from instrumentation. 523 // Clear all code from instrumentation.
531 void ClearAllBreakPoints(); 524 void ClearAllBreakPoints();
532 // Instrument a function with one-shots. 525 // Instrument a function with one-shots.
533 void FloodWithOneShot(Handle<JSFunction> function, 526 void FloodWithOneShot(Handle<SharedFunctionInfo> function);
534 BreakLocatorType type = ALL_BREAK_LOCATIONS);
535 // Clear all one-shot instrumentations, but restore break points. 527 // Clear all one-shot instrumentations, but restore break points.
536 void ClearOneShot(); 528 void ClearOneShot();
537 529
538 void ActivateStepOut(StackFrame* frame); 530 void ActivateStepOut(StackFrame* frame);
539 void RemoveDebugInfoAndClearFromShared(Handle<DebugInfo> debug_info); 531 void RemoveDebugInfoAndClearFromShared(Handle<DebugInfo> debug_info);
540 MaybeHandle<FixedArray> CheckBreakPoints(Handle<DebugInfo> debug_info, 532 MaybeHandle<FixedArray> CheckBreakPoints(Handle<DebugInfo> debug_info,
541 BreakLocation* location, 533 BreakLocation* location,
542 bool* has_break_points = nullptr); 534 bool* has_break_points = nullptr);
543 bool IsMutedAtCurrentLocation(JavaScriptFrame* frame); 535 bool IsMutedAtCurrentLocation(JavaScriptFrame* frame);
544 bool CheckBreakPoint(Handle<Object> break_point_object); 536 bool CheckBreakPoint(Handle<Object> break_point_object);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 // Frame id for the frame of the current break. 601 // Frame id for the frame of the current break.
610 StackFrame::Id break_frame_id_; 602 StackFrame::Id break_frame_id_;
611 603
612 // Step action for last step performed. 604 // Step action for last step performed.
613 StepAction last_step_action_; 605 StepAction last_step_action_;
614 606
615 // Source statement position from last step next action. 607 // Source statement position from last step next action.
616 int last_statement_position_; 608 int last_statement_position_;
617 609
618 // Frame pointer from last step next or step frame action. 610 // Frame pointer from last step next or step frame action.
619 Address last_fp_; 611 int last_frame_count_;
620 612
621 // Frame pointer of the target frame we want to arrive at. 613 // Frame pointer of the target frame we want to arrive at.
622 Address target_fp_; 614 int target_frame_count_;
623 615
624 // Stores the way how LiveEdit has patched the stack. It is used when 616 // Stores the way how LiveEdit has patched the stack. It is used when
625 // debugger returns control back to user script. 617 // debugger returns control back to user script.
626 LiveEditFrameDropMode frame_drop_mode_; 618 LiveEditFrameDropMode frame_drop_mode_;
627 619
628 // Value of accumulator in interpreter frames. In non-interpreter frames 620 // Value of accumulator in interpreter frames. In non-interpreter frames
629 // this value will be the hole. 621 // this value will be the hole.
630 Handle<Object> return_value_; 622 Handle<Object> return_value_;
631 623
632 Object* suspended_generator_; 624 Object* suspended_generator_;
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
760 Handle<Code> code); 752 Handle<Code> code);
761 static bool DebugBreakSlotIsPatched(Address pc); 753 static bool DebugBreakSlotIsPatched(Address pc);
762 static void ClearDebugBreakSlot(Isolate* isolate, Address pc); 754 static void ClearDebugBreakSlot(Isolate* isolate, Address pc);
763 }; 755 };
764 756
765 757
766 } // namespace internal 758 } // namespace internal
767 } // namespace v8 759 } // namespace v8
768 760
769 #endif // V8_DEBUG_DEBUG_H_ 761 #endif // V8_DEBUG_DEBUG_H_
OLDNEW
« no previous file with comments | « no previous file | src/debug/debug.cc » ('j') | src/debug/debug.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698