Add pause / resume profiling commands to debugger protocol.
This allows to profile "unresponsive" web pages in the same way as it is possible to break into them with the debugger. BUG=http://code.google.com/p/chromium/issues/detail?id=28689 Review URL: http://codereview.chromium.org/450011 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3382 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
c76856c292
commit
dd38c22699
@ -1245,6 +1245,8 @@ DebugCommandProcessor.prototype.processDebugJSONRequest = function(json_request)
|
||||
this.suspendRequest_(request, response);
|
||||
} else if (request.command == 'version') {
|
||||
this.versionRequest_(request, response);
|
||||
} else if (request.command == 'profile') {
|
||||
this.profileRequest_(request, response);
|
||||
} else {
|
||||
throw new Error('Unknown command "' + request.command + '" in request');
|
||||
}
|
||||
@ -1924,6 +1926,25 @@ DebugCommandProcessor.prototype.versionRequest_ = function(request, response) {
|
||||
};
|
||||
|
||||
|
||||
DebugCommandProcessor.prototype.profileRequest_ = function(request, response) {
|
||||
if (!request.arguments) {
|
||||
return response.failed('Missing arguments');
|
||||
}
|
||||
var modules = parseInt(request.arguments.modules);
|
||||
if (isNaN(modules)) {
|
||||
return response.failed('Modules is not an integer');
|
||||
}
|
||||
if (request.arguments.command == 'resume') {
|
||||
%ProfilerResume(modules);
|
||||
} else if (request.arguments.command == 'pause') {
|
||||
%ProfilerPause(modules);
|
||||
} else {
|
||||
return response.failed('Unknown command');
|
||||
}
|
||||
response.body = {};
|
||||
};
|
||||
|
||||
|
||||
// Check whether the previously processed command caused the VM to become
|
||||
// running.
|
||||
DebugCommandProcessor.prototype.isRunning = function() {
|
||||
|
@ -7691,8 +7691,31 @@ static Object* Runtime_FunctionGetInferredName(Arguments args) {
|
||||
CONVERT_CHECKED(JSFunction, f, args[0]);
|
||||
return f->shared()->inferred_name();
|
||||
}
|
||||
|
||||
#endif // ENABLE_DEBUGGER_SUPPORT
|
||||
|
||||
#ifdef ENABLE_LOGGING_AND_PROFILING
|
||||
|
||||
static Object* Runtime_ProfilerResume(Arguments args) {
|
||||
NoHandleAllocation ha;
|
||||
ASSERT(args.length() == 1);
|
||||
|
||||
CONVERT_CHECKED(Smi, smi_modules, args[0]);
|
||||
Logger::ResumeProfiler(smi_modules->value());
|
||||
return Heap::undefined_value();
|
||||
}
|
||||
|
||||
|
||||
static Object* Runtime_ProfilerPause(Arguments args) {
|
||||
NoHandleAllocation ha;
|
||||
ASSERT(args.length() == 1);
|
||||
|
||||
CONVERT_CHECKED(Smi, smi_modules, args[0]);
|
||||
Logger::PauseProfiler(smi_modules->value());
|
||||
return Heap::undefined_value();
|
||||
}
|
||||
|
||||
#endif // ENABLE_LOGGING_AND_PROFILING
|
||||
|
||||
// Finds the script object from the script data. NOTE: This operation uses
|
||||
// heap traversal to find the function generated for the source position
|
||||
|
@ -318,6 +318,14 @@ namespace internal {
|
||||
#define RUNTIME_FUNCTION_LIST_DEBUGGER_SUPPORT(F)
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_LOGGING_AND_PROFILING
|
||||
#define RUNTIME_FUNCTION_LIST_PROFILER_SUPPORT(F) \
|
||||
F(ProfilerResume, 1, 1) \
|
||||
F(ProfilerPause, 1, 1)
|
||||
#else
|
||||
#define RUNTIME_FUNCTION_LIST_PROFILER_SUPPORT(F)
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
#define RUNTIME_FUNCTION_LIST_DEBUG(F) \
|
||||
/* Testing */ \
|
||||
@ -336,7 +344,8 @@ namespace internal {
|
||||
RUNTIME_FUNCTION_LIST_ALWAYS_1(F) \
|
||||
RUNTIME_FUNCTION_LIST_ALWAYS_2(F) \
|
||||
RUNTIME_FUNCTION_LIST_DEBUG(F) \
|
||||
RUNTIME_FUNCTION_LIST_DEBUGGER_SUPPORT(F)
|
||||
RUNTIME_FUNCTION_LIST_DEBUGGER_SUPPORT(F) \
|
||||
RUNTIME_FUNCTION_LIST_PROFILER_SUPPORT(F)
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Runtime provides access to all C++ runtime functions.
|
||||
|
Loading…
Reference in New Issue
Block a user