[debugger] track debugger feature usage via histogram.

R=jochen@chromium.org

Review URL: https://codereview.chromium.org/1478613004

Cr-Commit-Position: refs/heads/master@{#32328}
This commit is contained in:
yangguo 2015-11-26 02:41:20 -08:00 committed by Commit bot
parent 8b192a2a30
commit 833fb7d870
6 changed files with 59 additions and 1 deletions

View File

@ -484,7 +484,8 @@ double AggregatedMemoryHistogram<Histogram>::Aggregate(double current_ms,
HR(gc_idle_time_limit_undershot, V8.GCIdleTimeLimit.Undershot, 0, 10000, \
101) \
HR(code_cache_reject_reason, V8.CodeCacheRejectReason, 1, 6, 6) \
HR(errors_thrown_per_context, V8.ErrorsThrownPerContext, 0, 200, 20)
HR(errors_thrown_per_context, V8.ErrorsThrownPerContext, 0, 200, 20) \
HR(debug_feature_usage, V8.DebugFeatureUsage, 1, 7, 7)
#define HISTOGRAM_TIMER_LIST(HT) \
/* Garbage collection timers. */ \

View File

@ -43,6 +43,7 @@ Debug::Debug(Isolate* isolate)
break_on_exception_(false),
break_on_uncaught_exception_(false),
debug_info_list_(NULL),
feature_tracker_(isolate),
isolate_(isolate) {
ThreadInit();
}
@ -316,6 +317,15 @@ Handle<Object> BreakLocation::BreakPointObjects() const {
}
void DebugFeatureTracker::Track(DebugFeatureTracker::Feature feature) {
uint32_t mask = 1 << feature;
// Only count one sample per feature and isolate.
if (bitfield_ & mask) return;
isolate_->counters()->debug_feature_usage()->AddSample(feature);
bitfield_ |= mask;
}
// Threading support.
void Debug::ThreadInit() {
thread_local_.break_count_ = 0;
@ -396,6 +406,9 @@ bool Debug::Load() {
debug_context_ = Handle<Context>::cast(
isolate_->global_handles()->Create(*context));
feature_tracker()->Track(DebugFeatureTracker::kActive);
return true;
}
@ -625,6 +638,8 @@ bool Debug::SetBreakPoint(Handle<JSFunction> function,
*source_position = location.statement_position();
location.SetBreakPoint(break_point_object);
feature_tracker()->Track(DebugFeatureTracker::kBreakPoint);
// At least one active break point now.
return debug_info->GetBreakPointCount() > 0;
}
@ -666,6 +681,8 @@ bool Debug::SetBreakPointForScript(Handle<Script> script,
debug_info, ALL_BREAK_LOCATIONS, position, alignment);
location.SetBreakPoint(break_point_object);
feature_tracker()->Track(DebugFeatureTracker::kBreakPoint);
position = (alignment == STATEMENT_ALIGNED) ? location.statement_position()
: location.position();
@ -874,6 +891,8 @@ void Debug::PrepareStep(StepAction step_action,
JavaScriptFrameIterator frames_it(isolate_, id);
JavaScriptFrame* frame = frames_it.frame();
feature_tracker()->Track(DebugFeatureTracker::kStepping);
// First of all ensure there is one-shot break points in the top handler
// if any.
FloodHandlerWithOneShot();

View File

@ -343,6 +343,28 @@ class LockingCommandMessageQueue BASE_EMBEDDED {
};
class DebugFeatureTracker {
public:
enum Feature {
kActive = 1,
kBreakPoint = 2,
kStepping = 3,
kHeapSnapshot = 4,
kAllocationTracking = 5,
kProfiler = 6,
kLiveEdit = 7,
};
explicit DebugFeatureTracker(Isolate* isolate)
: isolate_(isolate), bitfield_(0) {}
void Track(Feature feature);
private:
Isolate* isolate_;
uint32_t bitfield_;
};
// This class contains the debugger support. The main purpose is to handle
// setting break points in the code.
//
@ -508,6 +530,8 @@ class Debug {
StepAction last_step_action() { return thread_local_.last_step_action_; }
DebugFeatureTracker* feature_tracker() { return &feature_tracker_; }
private:
explicit Debug(Isolate* isolate);
@ -606,6 +630,9 @@ class Debug {
// before returning to the DebugBreakCallHelper.
Address after_break_target_;
// Used to collect histogram data on debugger feature usage.
DebugFeatureTracker feature_tracker_;
// Per-thread data.
class ThreadLocal {
public:

View File

@ -4,6 +4,7 @@
#include "src/profiler/cpu-profiler.h"
#include "src/debug/debug.h"
#include "src/deoptimizer.h"
#include "src/frames-inl.h"
#include "src/locked-queue-inl.h"
@ -438,6 +439,7 @@ void CpuProfiler::StartProfiling(const char* title, bool record_samples) {
void CpuProfiler::StartProfiling(String* title, bool record_samples) {
StartProfiling(profiles_->GetName(title), record_samples);
isolate_->debug()->feature_tracker()->Track(DebugFeatureTracker::kProfiler);
}

View File

@ -5,6 +5,7 @@
#include "src/profiler/heap-profiler.h"
#include "src/api.h"
#include "src/debug/debug.h"
#include "src/profiler/allocation-tracker.h"
#include "src/profiler/heap-snapshot-generator-inl.h"
@ -75,6 +76,10 @@ HeapSnapshot* HeapProfiler::TakeSnapshot(
}
ids_->RemoveDeadEntries();
is_tracking_object_moves_ = true;
heap()->isolate()->debug()->feature_tracker()->Track(
DebugFeatureTracker::kHeapSnapshot);
return result;
}
@ -86,6 +91,8 @@ void HeapProfiler::StartHeapObjectsTracking(bool track_allocations) {
if (track_allocations) {
allocation_tracker_.Reset(new AllocationTracker(ids_.get(), names_.get()));
heap()->DisableInlineAllocation();
heap()->isolate()->debug()->feature_tracker()->Track(
DebugFeatureTracker::kAllocationTracking);
}
}

View File

@ -229,6 +229,8 @@ RUNTIME_FUNCTION(Runtime_LiveEditCompareStrings) {
CONVERT_ARG_HANDLE_CHECKED(String, s1, 0);
CONVERT_ARG_HANDLE_CHECKED(String, s2, 1);
isolate->debug()->feature_tracker()->Track(DebugFeatureTracker::kLiveEdit);
return *LiveEdit::CompareStrings(s1, s2);
}