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

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

Issue 1478613004: [debugger] track debugger feature usage via histogram. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years 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 | « src/debug/debug.h ('k') | src/profiler/cpu-profiler.cc » ('j') | no next file with comments »
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 #include "src/debug/debug.h" 5 #include "src/debug/debug.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/arguments.h" 8 #include "src/arguments.h"
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 25 matching lines...) Expand all
36 command_queue_(isolate->logger(), kQueueInitialSize), 36 command_queue_(isolate->logger(), kQueueInitialSize),
37 is_active_(false), 37 is_active_(false),
38 is_suppressed_(false), 38 is_suppressed_(false),
39 live_edit_enabled_(true), // TODO(yangguo): set to false by default. 39 live_edit_enabled_(true), // TODO(yangguo): set to false by default.
40 break_disabled_(false), 40 break_disabled_(false),
41 break_points_active_(true), 41 break_points_active_(true),
42 in_debug_event_listener_(false), 42 in_debug_event_listener_(false),
43 break_on_exception_(false), 43 break_on_exception_(false),
44 break_on_uncaught_exception_(false), 44 break_on_uncaught_exception_(false),
45 debug_info_list_(NULL), 45 debug_info_list_(NULL),
46 feature_tracker_(isolate),
46 isolate_(isolate) { 47 isolate_(isolate) {
47 ThreadInit(); 48 ThreadInit();
48 } 49 }
49 50
50 51
51 static v8::Local<v8::Context> GetDebugEventContext(Isolate* isolate) { 52 static v8::Local<v8::Context> GetDebugEventContext(Isolate* isolate) {
52 Handle<Context> context = isolate->debug()->debugger_entry()->GetContext(); 53 Handle<Context> context = isolate->debug()->debugger_entry()->GetContext();
53 // Isolate::context() may have been NULL when "script collected" event 54 // Isolate::context() may have been NULL when "script collected" event
54 // occured. 55 // occured.
55 if (context.is_null()) return v8::Local<v8::Context>(); 56 if (context.is_null()) return v8::Local<v8::Context>();
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 } 310 }
310 return false; 311 return false;
311 } 312 }
312 313
313 314
314 Handle<Object> BreakLocation::BreakPointObjects() const { 315 Handle<Object> BreakLocation::BreakPointObjects() const {
315 return debug_info_->GetBreakPointObjects(pc_offset_); 316 return debug_info_->GetBreakPointObjects(pc_offset_);
316 } 317 }
317 318
318 319
320 void DebugFeatureTracker::Track(DebugFeatureTracker::Feature feature) {
321 uint32_t mask = 1 << feature;
322 // Only count one sample per feature and isolate.
323 if (bitfield_ & mask) return;
324 isolate_->counters()->debug_feature_usage()->AddSample(feature);
325 bitfield_ |= mask;
326 }
327
328
319 // Threading support. 329 // Threading support.
320 void Debug::ThreadInit() { 330 void Debug::ThreadInit() {
321 thread_local_.break_count_ = 0; 331 thread_local_.break_count_ = 0;
322 thread_local_.break_id_ = 0; 332 thread_local_.break_id_ = 0;
323 thread_local_.break_frame_id_ = StackFrame::NO_ID; 333 thread_local_.break_frame_id_ = StackFrame::NO_ID;
324 thread_local_.last_step_action_ = StepNone; 334 thread_local_.last_step_action_ = StepNone;
325 thread_local_.last_statement_position_ = RelocInfo::kNoPosition; 335 thread_local_.last_statement_position_ = RelocInfo::kNoPosition;
326 thread_local_.step_count_ = 0; 336 thread_local_.step_count_ = 0;
327 thread_local_.last_fp_ = 0; 337 thread_local_.last_fp_ = 0;
328 thread_local_.queued_step_count_ = 0; 338 thread_local_.queued_step_count_ = 0;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 ExtensionConfiguration no_extensions; 399 ExtensionConfiguration no_extensions;
390 Handle<Context> context = isolate_->bootstrapper()->CreateEnvironment( 400 Handle<Context> context = isolate_->bootstrapper()->CreateEnvironment(
391 MaybeHandle<JSGlobalProxy>(), v8::Local<ObjectTemplate>(), &no_extensions, 401 MaybeHandle<JSGlobalProxy>(), v8::Local<ObjectTemplate>(), &no_extensions,
392 DEBUG_CONTEXT); 402 DEBUG_CONTEXT);
393 403
394 // Fail if no context could be created. 404 // Fail if no context could be created.
395 if (context.is_null()) return false; 405 if (context.is_null()) return false;
396 406
397 debug_context_ = Handle<Context>::cast( 407 debug_context_ = Handle<Context>::cast(
398 isolate_->global_handles()->Create(*context)); 408 isolate_->global_handles()->Create(*context));
409
410 feature_tracker()->Track(DebugFeatureTracker::kActive);
411
399 return true; 412 return true;
400 } 413 }
401 414
402 415
403 void Debug::Unload() { 416 void Debug::Unload() {
404 ClearAllBreakPoints(); 417 ClearAllBreakPoints();
405 ClearStepping(); 418 ClearStepping();
406 419
407 // Return debugger is not loaded. 420 // Return debugger is not loaded.
408 if (!is_loaded()) return; 421 if (!is_loaded()) return;
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
618 Handle<DebugInfo> debug_info(shared->GetDebugInfo()); 631 Handle<DebugInfo> debug_info(shared->GetDebugInfo());
619 // Source positions starts with zero. 632 // Source positions starts with zero.
620 DCHECK(*source_position >= 0); 633 DCHECK(*source_position >= 0);
621 634
622 // Find the break point and change it. 635 // Find the break point and change it.
623 BreakLocation location = BreakLocation::FromPosition( 636 BreakLocation location = BreakLocation::FromPosition(
624 debug_info, ALL_BREAK_LOCATIONS, *source_position, STATEMENT_ALIGNED); 637 debug_info, ALL_BREAK_LOCATIONS, *source_position, STATEMENT_ALIGNED);
625 *source_position = location.statement_position(); 638 *source_position = location.statement_position();
626 location.SetBreakPoint(break_point_object); 639 location.SetBreakPoint(break_point_object);
627 640
641 feature_tracker()->Track(DebugFeatureTracker::kBreakPoint);
642
628 // At least one active break point now. 643 // At least one active break point now.
629 return debug_info->GetBreakPointCount() > 0; 644 return debug_info->GetBreakPointCount() > 0;
630 } 645 }
631 646
632 647
633 bool Debug::SetBreakPointForScript(Handle<Script> script, 648 bool Debug::SetBreakPointForScript(Handle<Script> script,
634 Handle<Object> break_point_object, 649 Handle<Object> break_point_object,
635 int* source_position, 650 int* source_position,
636 BreakPositionAlignment alignment) { 651 BreakPositionAlignment alignment) {
637 HandleScope scope(isolate_); 652 HandleScope scope(isolate_);
(...skipping 21 matching lines...) Expand all
659 674
660 Handle<DebugInfo> debug_info(shared->GetDebugInfo()); 675 Handle<DebugInfo> debug_info(shared->GetDebugInfo());
661 // Source positions starts with zero. 676 // Source positions starts with zero.
662 DCHECK(position >= 0); 677 DCHECK(position >= 0);
663 678
664 // Find the break point and change it. 679 // Find the break point and change it.
665 BreakLocation location = BreakLocation::FromPosition( 680 BreakLocation location = BreakLocation::FromPosition(
666 debug_info, ALL_BREAK_LOCATIONS, position, alignment); 681 debug_info, ALL_BREAK_LOCATIONS, position, alignment);
667 location.SetBreakPoint(break_point_object); 682 location.SetBreakPoint(break_point_object);
668 683
684 feature_tracker()->Track(DebugFeatureTracker::kBreakPoint);
685
669 position = (alignment == STATEMENT_ALIGNED) ? location.statement_position() 686 position = (alignment == STATEMENT_ALIGNED) ? location.statement_position()
670 : location.position(); 687 : location.position();
671 688
672 *source_position = position + shared->start_position(); 689 *source_position = position + shared->start_position();
673 690
674 // At least one active break point now. 691 // At least one active break point now.
675 DCHECK(debug_info->GetBreakPointCount() > 0); 692 DCHECK(debug_info->GetBreakPointCount() > 0);
676 return true; 693 return true;
677 } 694 }
678 695
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 if (id == StackFrame::NO_ID) { 884 if (id == StackFrame::NO_ID) {
868 // If there is no JavaScript stack don't do anything. 885 // If there is no JavaScript stack don't do anything.
869 return; 886 return;
870 } 887 }
871 if (frame_id != StackFrame::NO_ID) { 888 if (frame_id != StackFrame::NO_ID) {
872 id = frame_id; 889 id = frame_id;
873 } 890 }
874 JavaScriptFrameIterator frames_it(isolate_, id); 891 JavaScriptFrameIterator frames_it(isolate_, id);
875 JavaScriptFrame* frame = frames_it.frame(); 892 JavaScriptFrame* frame = frames_it.frame();
876 893
894 feature_tracker()->Track(DebugFeatureTracker::kStepping);
895
877 // First of all ensure there is one-shot break points in the top handler 896 // First of all ensure there is one-shot break points in the top handler
878 // if any. 897 // if any.
879 FloodHandlerWithOneShot(); 898 FloodHandlerWithOneShot();
880 899
881 // If the function on the top frame is unresolved perform step out. This will 900 // If the function on the top frame is unresolved perform step out. This will
882 // be the case when calling unknown function and having the debugger stopped 901 // be the case when calling unknown function and having the debugger stopped
883 // in an unhandled exception. 902 // in an unhandled exception.
884 if (!frame->function()->IsJSFunction()) { 903 if (!frame->function()->IsJSFunction()) {
885 // Step out: Find the calling JavaScript frame and flood it with 904 // Step out: Find the calling JavaScript frame and flood it with
886 // breakpoints. 905 // breakpoints.
(...skipping 1715 matching lines...) Expand 10 before | Expand all | Expand 10 after
2602 } 2621 }
2603 2622
2604 2623
2605 void LockingCommandMessageQueue::Clear() { 2624 void LockingCommandMessageQueue::Clear() {
2606 base::LockGuard<base::Mutex> lock_guard(&mutex_); 2625 base::LockGuard<base::Mutex> lock_guard(&mutex_);
2607 queue_.Clear(); 2626 queue_.Clear();
2608 } 2627 }
2609 2628
2610 } // namespace internal 2629 } // namespace internal
2611 } // namespace v8 2630 } // namespace v8
OLDNEW
« no previous file with comments | « src/debug/debug.h ('k') | src/profiler/cpu-profiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698