void CpuProfiler::StartCollectingProfile(const char* title) {
if (profiles_->StartProfiling(title, next_profile_uid_++)) {
StartProcessorIfNotStarted();
- generator_->AddCurrentStack();
}
}
void CpuProfiler::StartCollectingProfile(String* title) {
- StartCollectingProfile(profiles_->GetName(title));
+ if (profiles_->StartProfiling(title, next_profile_uid_++)) {
+ StartProcessorIfNotStarted();
+ }
}
#ifdef ENABLE_LOGGING_AND_PROFILING
#include "v8.h"
-#include "frames-inl.h"
#include "global-handles.h"
#include "profile-generator-inl.h"
profiles_->AddPathToCurrentProfiles(entries);
}
-
-void ProfileGenerator::AddCurrentStack() {
- TickSample sample;
- sample.state = VMState::current_state();
- sample.pc = reinterpret_cast<Address>(&sample); // Not NULL.
- sample.frames_count = 0;
- for (StackTraceFrameIterator it;
- !it.done() && sample.frames_count < TickSample::kMaxFramesCount;
- it.Advance()) {
- JavaScriptFrame* frame = it.frame();
- sample.stack[sample.frames_count++] =
- reinterpret_cast<Address>(frame->function());
- }
- RecordTickSample(sample);
-}
-
} } // namespace v8::internal
#endif // ENABLE_LOGGING_AND_PROFILING
CpuProfile* GetProfile(int security_token_id, unsigned uid);
inline bool is_last_profile();
- const char* GetName(String* name);
CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag,
String* name, String* resource_name, int line_number);
CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, const char* name);
private:
INLINE(const char* GetFunctionName(String* name));
INLINE(const char* GetFunctionName(const char* name));
+ const char* GetName(String* name);
const char* GetName(int args_count);
List<CpuProfile*>* GetProfilesList(int security_token_id);
int TokenToIndex(int security_token_id);
return sample_rate_calc_.ticks_per_ms();
}
- // Samples stack and adds it to current profiles.
- void AddCurrentStack();
-
static const char* kAnonymousFunctionName;
static const char* kProgramEntryName;
static const char* kGarbageCollectorEntryName;
#include "v8.h"
#include "profile-generator-inl.h"
#include "cctest.h"
-#include "../include/v8-profiler.h"
namespace i = v8::internal;
using i::CodeEntry;
using i::CodeMap;
using i::CpuProfile;
-using i::CpuProfiler;
using i::CpuProfilesCollection;
using i::ProfileNode;
using i::ProfileTree;
CHECK_EQ(kSamplingIntervalMs * 0.66666, calc3.ticks_per_ms());
}
-
-// --- P r o f i l e r E x t e n s i o n ---
-
-class ProfilerExtension : public v8::Extension {
- public:
- ProfilerExtension() : v8::Extension("v8/profiler", kSource) { }
- virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction(
- v8::Handle<v8::String> name);
- static v8::Handle<v8::Value> StartProfiling(const v8::Arguments& args);
- static v8::Handle<v8::Value> StopProfiling(const v8::Arguments& args);
- private:
- static const char* kSource;
-};
-
-
-const char* ProfilerExtension::kSource =
- "native function startProfiling();"
- "native function stopProfiling();";
-
-v8::Handle<v8::FunctionTemplate> ProfilerExtension::GetNativeFunction(
- v8::Handle<v8::String> name) {
- if (name->Equals(v8::String::New("startProfiling"))) {
- return v8::FunctionTemplate::New(ProfilerExtension::StartProfiling);
- } else if (name->Equals(v8::String::New("stopProfiling"))) {
- return v8::FunctionTemplate::New(ProfilerExtension::StopProfiling);
- } else {
- CHECK(false);
- return v8::Handle<v8::FunctionTemplate>();
- }
-}
-
-
-v8::Handle<v8::Value> ProfilerExtension::StartProfiling(const v8::Arguments& args) {
- if (args.Length() > 0)
- v8::CpuProfiler::StartProfiling(args[0].As<v8::String>());
- else
- v8::CpuProfiler::StartProfiling(v8::String::New(""));
- return v8::Undefined();
-}
-
-
-v8::Handle<v8::Value> ProfilerExtension::StopProfiling(const v8::Arguments& args) {
- if (args.Length() > 0)
- v8::CpuProfiler::StopProfiling(args[0].As<v8::String>());
- else
- v8::CpuProfiler::StopProfiling(v8::String::New(""));
- return v8::Undefined();
-}
-
-
-static ProfilerExtension kProfilerExtension;
-v8::DeclareExtension kProfilerExtensionDeclaration(&kProfilerExtension);
-static v8::Persistent<v8::Context> env;
-
-TEST(RecordStackTraceAtStartProfiling) {
- if (env.IsEmpty()) {
- v8::HandleScope scope;
- const char* extensions[] = { "v8/profiler" };
- v8::ExtensionConfiguration config(1, extensions);
- env = v8::Context::New(&config);
- }
- v8::HandleScope scope;
- env->Enter();
-
- CHECK_EQ(0, CpuProfiler::GetProfilesCount());
- CompileRun(
- "function c() { startProfiling(); }\n"
- "function b() { c(); }\n"
- "function a() { b(); }\n"
- "a();\n"
- "stopProfiling();"
- );
- CHECK_EQ(1, CpuProfiler::GetProfilesCount());
-}
-
#endif // ENABLE_LOGGING_AND_PROFILING