|
|
@ -43,8 +43,6 @@ |
|
|
|
namespace v8 { |
|
|
|
namespace internal { |
|
|
|
|
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
|
|
|
|
//
|
|
|
|
// Sliding state window. Updates counters to keep track of the last
|
|
|
|
// window of kBufferSize states. This is useful to track where we
|
|
|
@ -554,71 +552,54 @@ void Logger::ProfilerBeginEvent() { |
|
|
|
msg.WriteToLogFile(); |
|
|
|
} |
|
|
|
|
|
|
|
#endif // ENABLE_LOGGING_AND_PROFILING
|
|
|
|
|
|
|
|
|
|
|
|
void Logger::StringEvent(const char* name, const char* value) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (FLAG_log) UncheckedStringEvent(name, value); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
void Logger::UncheckedStringEvent(const char* name, const char* value) { |
|
|
|
if (!log_->IsEnabled()) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
msg.Append("%s,\"%s\"\n", name, value); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
void Logger::IntEvent(const char* name, int value) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (FLAG_log) UncheckedIntEvent(name, value); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::IntPtrTEvent(const char* name, intptr_t value) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (FLAG_log) UncheckedIntPtrTEvent(name, value); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
void Logger::UncheckedIntEvent(const char* name, int value) { |
|
|
|
if (!log_->IsEnabled()) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
msg.Append("%s,%d\n", name, value); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
void Logger::UncheckedIntPtrTEvent(const char* name, intptr_t value) { |
|
|
|
if (!log_->IsEnabled()) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
msg.Append("%s,%" V8_PTR_PREFIX "d\n", name, value); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
void Logger::HandleEvent(const char* name, Object** location) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_handles) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
msg.Append("%s,0x%" V8PRIxPTR "\n", name, location); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
// ApiEvent is private so all the calls come from the Logger class. It is the
|
|
|
|
// caller's responsibility to ensure that log is enabled and that
|
|
|
|
// FLAG_log_api is true.
|
|
|
@ -631,11 +612,9 @@ void Logger::ApiEvent(const char* format, ...) { |
|
|
|
va_end(ap); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
void Logger::ApiNamedSecurityCheck(Object* key) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_api) return; |
|
|
|
if (key->IsString()) { |
|
|
|
SmartPointer<char> str = |
|
|
@ -646,14 +625,12 @@ void Logger::ApiNamedSecurityCheck(Object* key) { |
|
|
|
} else { |
|
|
|
ApiEvent("api,check-security,['no-name']\n"); |
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::SharedLibraryEvent(const char* library_path, |
|
|
|
uintptr_t start, |
|
|
|
uintptr_t end) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_prof) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
msg.Append("shared-library,\"%s\",0x%08" V8PRIxPTR ",0x%08" V8PRIxPTR "\n", |
|
|
@ -661,14 +638,12 @@ void Logger::SharedLibraryEvent(const char* library_path, |
|
|
|
start, |
|
|
|
end); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::SharedLibraryEvent(const wchar_t* library_path, |
|
|
|
uintptr_t start, |
|
|
|
uintptr_t end) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_prof) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
msg.Append("shared-library,\"%ls\",0x%08" V8PRIxPTR ",0x%08" V8PRIxPTR "\n", |
|
|
@ -676,11 +651,9 @@ void Logger::SharedLibraryEvent(const wchar_t* library_path, |
|
|
|
start, |
|
|
|
end); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
void Logger::LogRegExpSource(Handle<JSRegExp> regexp) { |
|
|
|
// Prints "/" + re.source + "/" +
|
|
|
|
// (re.global?"g":"") + (re.ignorecase?"i":"") + (re.multiline?"m":"")
|
|
|
@ -721,23 +694,19 @@ void Logger::LogRegExpSource(Handle<JSRegExp> regexp) { |
|
|
|
|
|
|
|
msg.WriteToLogFile(); |
|
|
|
} |
|
|
|
#endif // ENABLE_LOGGING_AND_PROFILING
|
|
|
|
|
|
|
|
|
|
|
|
void Logger::RegExpCompileEvent(Handle<JSRegExp> regexp, bool in_cache) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_regexp) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
msg.Append("regexp-compile,"); |
|
|
|
LogRegExpSource(regexp); |
|
|
|
msg.Append(in_cache ? ",hit\n" : ",miss\n"); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::LogRuntime(Vector<const char> format, JSArray* args) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_runtime) return; |
|
|
|
HandleScope scope; |
|
|
|
LogMessageBuilder msg(this); |
|
|
@ -778,22 +747,18 @@ void Logger::LogRuntime(Vector<const char> format, JSArray* args) { |
|
|
|
} |
|
|
|
msg.Append('\n'); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::ApiIndexedSecurityCheck(uint32_t index) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_api) return; |
|
|
|
ApiEvent("api,check-security,%u\n", index); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::ApiNamedPropertyAccess(const char* tag, |
|
|
|
JSObject* holder, |
|
|
|
Object* name) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
ASSERT(name->IsString()); |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_api) return; |
|
|
|
String* class_name_obj = holder->class_name(); |
|
|
@ -802,58 +767,47 @@ void Logger::ApiNamedPropertyAccess(const char* tag, |
|
|
|
SmartPointer<char> property_name = |
|
|
|
String::cast(name)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
|
|
|
ApiEvent("api,%s,\"%s\",\"%s\"\n", tag, *class_name, *property_name); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
void Logger::ApiIndexedPropertyAccess(const char* tag, |
|
|
|
JSObject* holder, |
|
|
|
uint32_t index) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_api) return; |
|
|
|
String* class_name_obj = holder->class_name(); |
|
|
|
SmartPointer<char> class_name = |
|
|
|
class_name_obj->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
|
|
|
ApiEvent("api,%s,\"%s\",%u\n", tag, *class_name, index); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
void Logger::ApiObjectAccess(const char* tag, JSObject* object) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_api) return; |
|
|
|
String* class_name_obj = object->class_name(); |
|
|
|
SmartPointer<char> class_name = |
|
|
|
class_name_obj->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
|
|
|
ApiEvent("api,%s,\"%s\"\n", tag, *class_name); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::ApiEntryCall(const char* name) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_api) return; |
|
|
|
ApiEvent("api,%s\n", name); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::NewEvent(const char* name, void* object, size_t size) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
msg.Append("new,%s,0x%" V8PRIxPTR ",%u\n", name, object, |
|
|
|
static_cast<unsigned int>(size)); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::DeleteEvent(const char* name, void* object) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
msg.Append("delete,%s,0x%" V8PRIxPTR "\n", name, object); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -866,7 +820,6 @@ void Logger::DeleteEventStatic(const char* name, void* object) { |
|
|
|
LOGGER->DeleteEvent(name, object); |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
void Logger::CallbackEventInternal(const char* prefix, const char* name, |
|
|
|
Address entry_point) { |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_code) return; |
|
|
@ -879,43 +832,35 @@ void Logger::CallbackEventInternal(const char* prefix, const char* name, |
|
|
|
msg.Append('\n'); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
void Logger::CallbackEvent(String* name, Address entry_point) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_code) return; |
|
|
|
SmartPointer<char> str = |
|
|
|
name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
|
|
|
CallbackEventInternal("", *str, entry_point); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::GetterCallbackEvent(String* name, Address entry_point) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_code) return; |
|
|
|
SmartPointer<char> str = |
|
|
|
name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
|
|
|
CallbackEventInternal("get ", *str, entry_point); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::SetterCallbackEvent(String* name, Address entry_point) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_code) return; |
|
|
|
SmartPointer<char> str = |
|
|
|
name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
|
|
|
CallbackEventInternal("set ", *str, entry_point); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::CodeCreateEvent(LogEventsAndTags tag, |
|
|
|
Code* code, |
|
|
|
const char* comment) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled()) return; |
|
|
|
if (FLAG_ll_prof || Serializer::enabled()) { |
|
|
|
name_buffer_->Reset(); |
|
|
@ -945,14 +890,12 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, |
|
|
|
msg.Append('"'); |
|
|
|
msg.Append('\n'); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::CodeCreateEvent(LogEventsAndTags tag, |
|
|
|
Code* code, |
|
|
|
String* name) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled()) return; |
|
|
|
if (FLAG_ll_prof || Serializer::enabled()) { |
|
|
|
name_buffer_->Reset(); |
|
|
@ -977,11 +920,9 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, |
|
|
|
msg.Append('"'); |
|
|
|
msg.Append('\n'); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
// ComputeMarker must only be used when SharedFunctionInfo is known.
|
|
|
|
static const char* ComputeMarker(Code* code) { |
|
|
|
switch (code->kind()) { |
|
|
@ -990,14 +931,12 @@ static const char* ComputeMarker(Code* code) { |
|
|
|
default: return ""; |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
void Logger::CodeCreateEvent(LogEventsAndTags tag, |
|
|
|
Code* code, |
|
|
|
SharedFunctionInfo* shared, |
|
|
|
String* name) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled()) return; |
|
|
|
if (FLAG_ll_prof || Serializer::enabled()) { |
|
|
|
name_buffer_->Reset(); |
|
|
@ -1029,7 +968,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, |
|
|
|
msg.Append(",%s", ComputeMarker(code)); |
|
|
|
msg.Append('\n'); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -1040,7 +978,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, |
|
|
|
Code* code, |
|
|
|
SharedFunctionInfo* shared, |
|
|
|
String* source, int line) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled()) return; |
|
|
|
if (FLAG_ll_prof || Serializer::enabled()) { |
|
|
|
name_buffer_->Reset(); |
|
|
@ -1078,12 +1015,10 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, |
|
|
|
msg.Append(",%s", ComputeMarker(code)); |
|
|
|
msg.Append('\n'); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::CodeCreateEvent(LogEventsAndTags tag, Code* code, int args_count) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled()) return; |
|
|
|
if (FLAG_ll_prof || Serializer::enabled()) { |
|
|
|
name_buffer_->Reset(); |
|
|
@ -1106,21 +1041,17 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, Code* code, int args_count) { |
|
|
|
msg.Append(",%d,\"args_count: %d\"", code->ExecutableSize(), args_count); |
|
|
|
msg.Append('\n'); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::CodeMovingGCEvent() { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_ll_prof) return; |
|
|
|
LowLevelLogWriteBytes(&kCodeMovingGCTag, sizeof(kCodeMovingGCTag)); |
|
|
|
OS::SignalCodeMovingGC(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::RegExpCodeCreateEvent(Code* code, String* source) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled()) return; |
|
|
|
if (FLAG_ll_prof || Serializer::enabled()) { |
|
|
|
name_buffer_->Reset(); |
|
|
@ -1145,36 +1076,30 @@ void Logger::RegExpCodeCreateEvent(Code* code, String* source) { |
|
|
|
msg.Append('\"'); |
|
|
|
msg.Append('\n'); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::CodeMoveEvent(Address from, Address to) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled()) return; |
|
|
|
if (FLAG_ll_prof) LowLevelCodeMoveEvent(from, to); |
|
|
|
if (Serializer::enabled() && address_to_name_map_ != NULL) { |
|
|
|
address_to_name_map_->Move(from, to); |
|
|
|
} |
|
|
|
MoveEventInternal(CODE_MOVE_EVENT, from, to); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::CodeDeleteEvent(Address from) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled()) return; |
|
|
|
if (FLAG_ll_prof) LowLevelCodeDeleteEvent(from); |
|
|
|
if (Serializer::enabled() && address_to_name_map_ != NULL) { |
|
|
|
address_to_name_map_->Remove(from); |
|
|
|
} |
|
|
|
DeleteEventInternal(CODE_DELETE_EVENT, from); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::SnapshotPositionEvent(Address addr, int pos) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled()) return; |
|
|
|
if (FLAG_ll_prof) LowLevelSnapshotPositionEvent(addr, pos); |
|
|
|
if (Serializer::enabled() && address_to_name_map_ != NULL) { |
|
|
@ -1196,18 +1121,14 @@ void Logger::SnapshotPositionEvent(Address addr, int pos) { |
|
|
|
msg.Append(",%d", pos); |
|
|
|
msg.Append('\n'); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::SharedFunctionInfoMoveEvent(Address from, Address to) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
MoveEventInternal(SHARED_FUNC_MOVE_EVENT, from, to); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
void Logger::MoveEventInternal(LogEventsAndTags event, |
|
|
|
Address from, |
|
|
|
Address to) { |
|
|
@ -1220,10 +1141,8 @@ void Logger::MoveEventInternal(LogEventsAndTags event, |
|
|
|
msg.Append('\n'); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
void Logger::DeleteEventInternal(LogEventsAndTags event, Address from) { |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_code) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
@ -1232,11 +1151,9 @@ void Logger::DeleteEventInternal(LogEventsAndTags event, Address from) { |
|
|
|
msg.Append('\n'); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
void Logger::ResourceEvent(const char* name, const char* tag) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
msg.Append("%s,%s,", name, tag); |
|
|
@ -1249,12 +1166,10 @@ void Logger::ResourceEvent(const char* name, const char* tag) { |
|
|
|
|
|
|
|
msg.Append('\n'); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::SuspectReadEvent(String* name, Object* obj) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_suspect) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
String* class_name = obj->IsJSObject() |
|
|
@ -1268,12 +1183,10 @@ void Logger::SuspectReadEvent(String* name, Object* obj) { |
|
|
|
msg.Append('"'); |
|
|
|
msg.Append('\n'); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::HeapSampleBeginEvent(const char* space, const char* kind) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_gc) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
// Using non-relative system time in order to be able to synchronize with
|
|
|
@ -1281,42 +1194,34 @@ void Logger::HeapSampleBeginEvent(const char* space, const char* kind) { |
|
|
|
msg.Append("heap-sample-begin,\"%s\",\"%s\",%.0f\n", |
|
|
|
space, kind, OS::TimeCurrentMillis()); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::HeapSampleEndEvent(const char* space, const char* kind) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_gc) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
msg.Append("heap-sample-end,\"%s\",\"%s\"\n", space, kind); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::HeapSampleItemEvent(const char* type, int number, int bytes) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log_gc) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
msg.Append("heap-sample-item,%s,%d,%d\n", type, number, bytes); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::DebugTag(const char* call_site_tag) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
|
msg.Append("debug-tag,%s\n", call_site_tag); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::DebugEvent(const char* event_type, Vector<uint16_t> parameter) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_log) return; |
|
|
|
StringBuilder s(parameter.length() + 1); |
|
|
|
for (int i = 0; i < parameter.length(); ++i) { |
|
|
@ -1330,11 +1235,9 @@ void Logger::DebugEvent(const char* event_type, Vector<uint16_t> parameter) { |
|
|
|
parameter_string); |
|
|
|
DeleteArray(parameter_string); |
|
|
|
msg.WriteToLogFile(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
void Logger::TickEvent(TickSample* sample, bool overflow) { |
|
|
|
if (!log_->IsEnabled() || !FLAG_prof) return; |
|
|
|
LogMessageBuilder msg(this); |
|
|
@ -1378,7 +1281,6 @@ void Logger::PauseProfiler() { |
|
|
|
ticker_->Stop(); |
|
|
|
} |
|
|
|
FLAG_log_code = false; |
|
|
|
// Must be the same message as Log::kDynamicBufferSeal.
|
|
|
|
LOG(ISOLATE, UncheckedStringEvent("profiler", "pause")); |
|
|
|
} |
|
|
|
--logging_nesting_; |
|
|
@ -1420,11 +1322,6 @@ bool Logger::IsProfilerSamplerActive() { |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int Logger::GetLogLines(int from_pos, char* dest_buf, int max_size) { |
|
|
|
return log_->GetLogLines(from_pos, dest_buf, max_size); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
class EnumerateOptimizedFunctionsVisitor: public OptimizedFunctionVisitor { |
|
|
|
public: |
|
|
|
EnumerateOptimizedFunctionsVisitor(Handle<SharedFunctionInfo>* sfis, |
|
|
@ -1545,7 +1442,6 @@ void Logger::LogCodeObject(Object* object) { |
|
|
|
|
|
|
|
|
|
|
|
void Logger::LogCodeInfo() { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!log_->IsEnabled() || !FLAG_ll_prof) return; |
|
|
|
#if V8_TARGET_ARCH_IA32 |
|
|
|
const char arch[] = "ia32"; |
|
|
@ -1557,7 +1453,6 @@ void Logger::LogCodeInfo() { |
|
|
|
const char arch[] = "unknown"; |
|
|
|
#endif |
|
|
|
LowLevelLogWriteBytes(arch, sizeof(arch)); |
|
|
|
#endif // ENABLE_LOGGING_AND_PROFILING
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -1710,11 +1605,8 @@ void Logger::LogAccessorCallbacks() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
bool Logger::Setup() { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
// Tests and EnsureInitialize() can call this twice in a row. It's harmless.
|
|
|
|
if (is_initialized_) return true; |
|
|
|
is_initialized_ = true; |
|
|
@ -1766,40 +1658,27 @@ bool Logger::Setup() { |
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
#else |
|
|
|
return false; |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Sampler* Logger::sampler() { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
return ticker_; |
|
|
|
#else |
|
|
|
return NULL; |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::EnsureTickerStarted() { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
ASSERT(ticker_ != NULL); |
|
|
|
if (!ticker_->IsActive()) ticker_->Start(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::EnsureTickerStopped() { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (ticker_ != NULL && ticker_->IsActive()) ticker_->Stop(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::TearDown() { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
if (!is_initialized_) return; |
|
|
|
FILE* Logger::TearDown() { |
|
|
|
if (!is_initialized_) return NULL; |
|
|
|
is_initialized_ = false; |
|
|
|
|
|
|
|
// Stop the profiler before closing the file.
|
|
|
@ -1815,13 +1694,11 @@ void Logger::TearDown() { |
|
|
|
delete ticker_; |
|
|
|
ticker_ = NULL; |
|
|
|
|
|
|
|
log_->Close(); |
|
|
|
#endif |
|
|
|
return log_->Close(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Logger::EnableSlidingStateWindow() { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
// If the ticker is NULL, Logger::Setup has not been called yet. In
|
|
|
|
// that case, we set the sliding_state_window flag so that the
|
|
|
|
// sliding window computation will be started when Logger::Setup is
|
|
|
@ -1835,7 +1712,6 @@ void Logger::EnableSlidingStateWindow() { |
|
|
|
if (sliding_state_window_ == NULL) { |
|
|
|
sliding_state_window_ = new SlidingStateWindow(Isolate::Current()); |
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -1855,10 +1731,8 @@ bool SamplerRegistry::IterateActiveSamplers(VisitSampler func, void* param) { |
|
|
|
|
|
|
|
|
|
|
|
static void ComputeCpuProfiling(Sampler* sampler, void* flag_ptr) { |
|
|
|
#ifdef ENABLE_LOGGING_AND_PROFILING |
|
|
|
bool* flag = reinterpret_cast<bool*>(flag_ptr); |
|
|
|
*flag |= sampler->IsProfiling(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|