From dd38c2269936b96477a0626dd6977ad2dabcbdfa Mon Sep 17 00:00:00 2001 From: "mikhail.naganov@gmail.com" Date: Mon, 30 Nov 2009 14:56:20 +0000 Subject: [PATCH] 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 --- src/debug-delay.js | 21 +++++++++++++++++++++ src/runtime.cc | 23 +++++++++++++++++++++++ src/runtime.h | 11 ++++++++++- 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/debug-delay.js b/src/debug-delay.js index 35f7fcd..04fde1f 100644 --- a/src/debug-delay.js +++ b/src/debug-delay.js @@ -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() { diff --git a/src/runtime.cc b/src/runtime.cc index b7ddd0c..6a5a7f0 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -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 diff --git a/src/runtime.h b/src/runtime.h index c05ae6b..8580233 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -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. -- 2.7.4