OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 return data_size; | 119 return data_size; |
120 } | 120 } |
121 | 121 |
122 // Must be the same message as in Logger::PauseProfiler. | 122 // Must be the same message as in Logger::PauseProfiler. |
123 const char* const Log::kDynamicBufferSeal = "profiler,\"pause\"\n"; | 123 const char* const Log::kDynamicBufferSeal = "profiler,\"pause\"\n"; |
124 | 124 |
125 Log::Log(Logger* logger) | 125 Log::Log(Logger* logger) |
126 : write_to_file_(false), | 126 : write_to_file_(false), |
127 is_stopped_(false), | 127 is_stopped_(false), |
128 output_handle_(NULL), | 128 output_handle_(NULL), |
129 output_code_handle_(NULL), | 129 ll_output_handle_(NULL), |
130 output_buffer_(NULL), | 130 output_buffer_(NULL), |
131 mutex_(NULL), | 131 mutex_(NULL), |
132 message_buffer_(NULL), | 132 message_buffer_(NULL), |
133 logger_(logger) { | 133 logger_(logger) { |
134 } | 134 } |
135 | 135 |
136 | 136 |
137 static void AddIsolateIdIfNeeded(StringStream* stream) { | 137 static void AddIsolateIdIfNeeded(StringStream* stream) { |
138 Isolate* isolate = Isolate::Current(); | 138 Isolate* isolate = Isolate::Current(); |
139 if (isolate->IsDefaultIsolate()) return; | 139 if (isolate->IsDefaultIsolate()) return; |
(...skipping 21 matching lines...) Expand all Loading... |
161 if (FLAG_prof) FLAG_log_code = true; | 161 if (FLAG_prof) FLAG_log_code = true; |
162 | 162 |
163 // --prof_lazy controls --log-code, implies --noprof_auto. | 163 // --prof_lazy controls --log-code, implies --noprof_auto. |
164 if (FLAG_prof_lazy) { | 164 if (FLAG_prof_lazy) { |
165 FLAG_log_code = false; | 165 FLAG_log_code = false; |
166 FLAG_prof_auto = false; | 166 FLAG_prof_auto = false; |
167 } | 167 } |
168 | 168 |
169 bool start_logging = FLAG_log || FLAG_log_runtime || FLAG_log_api | 169 bool start_logging = FLAG_log || FLAG_log_runtime || FLAG_log_api |
170 || FLAG_log_code || FLAG_log_gc || FLAG_log_handles || FLAG_log_suspect | 170 || FLAG_log_code || FLAG_log_gc || FLAG_log_handles || FLAG_log_suspect |
171 || FLAG_log_regexp || FLAG_log_state_changes; | 171 || FLAG_log_regexp || FLAG_log_state_changes || FLAG_ll_prof; |
172 | 172 |
173 bool open_log_file = start_logging || FLAG_prof_lazy; | 173 bool open_log_file = start_logging || FLAG_prof_lazy; |
174 | 174 |
175 // If we're logging anything, we need to open the log file. | 175 // If we're logging anything, we need to open the log file. |
176 if (open_log_file) { | 176 if (open_log_file) { |
177 if (strcmp(FLAG_logfile, "-") == 0) { | 177 if (strcmp(FLAG_logfile, "-") == 0) { |
178 OpenStdout(); | 178 OpenStdout(); |
179 } else if (strcmp(FLAG_logfile, "*") == 0) { | 179 } else if (strcmp(FLAG_logfile, "*") == 0) { |
180 OpenMemoryBuffer(); | 180 OpenMemoryBuffer(); |
181 } else { | 181 } else { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 } | 226 } |
227 | 227 |
228 | 228 |
229 void Log::OpenStdout() { | 229 void Log::OpenStdout() { |
230 ASSERT(!IsEnabled()); | 230 ASSERT(!IsEnabled()); |
231 output_handle_ = stdout; | 231 output_handle_ = stdout; |
232 write_to_file_ = true; | 232 write_to_file_ = true; |
233 } | 233 } |
234 | 234 |
235 | 235 |
236 static const char kCodeLogExt[] = ".code"; | 236 // Extension added to V8 log file name to get the low-level log name. |
| 237 static const char kLowLevelLogExt[] = ".ll"; |
| 238 |
| 239 // File buffer size of the low-level log. We don't use the default to |
| 240 // minimize the associated overhead. |
| 241 static const int kLowLevelLogBufferSize = 2 * MB; |
237 | 242 |
238 | 243 |
239 void Log::OpenFile(const char* name) { | 244 void Log::OpenFile(const char* name) { |
240 ASSERT(!IsEnabled()); | 245 ASSERT(!IsEnabled()); |
241 output_handle_ = OS::FOpen(name, OS::LogFileOpenMode); | 246 output_handle_ = OS::FOpen(name, OS::LogFileOpenMode); |
242 write_to_file_ = true; | 247 write_to_file_ = true; |
243 if (FLAG_ll_prof) { | 248 if (FLAG_ll_prof) { |
244 // Open a file for logging the contents of code objects so that | 249 // Open the low-level log file. |
245 // they can be disassembled later. | 250 size_t len = strlen(name); |
246 size_t name_len = strlen(name); | 251 ScopedVector<char> ll_name(static_cast<int>(len + sizeof(kLowLevelLogExt))); |
247 ScopedVector<char> code_name( | 252 memcpy(ll_name.start(), name, len); |
248 static_cast<int>(name_len + sizeof(kCodeLogExt))); | 253 memcpy(ll_name.start() + len, kLowLevelLogExt, sizeof(kLowLevelLogExt)); |
249 memcpy(code_name.start(), name, name_len); | 254 ll_output_handle_ = OS::FOpen(ll_name.start(), OS::LogFileOpenMode); |
250 memcpy(code_name.start() + name_len, kCodeLogExt, sizeof(kCodeLogExt)); | 255 setvbuf(ll_output_handle_, NULL, _IOFBF, kLowLevelLogBufferSize); |
251 output_code_handle_ = OS::FOpen(code_name.start(), OS::LogFileOpenMode); | |
252 } | 256 } |
253 } | 257 } |
254 | 258 |
255 | 259 |
256 void Log::OpenMemoryBuffer() { | 260 void Log::OpenMemoryBuffer() { |
257 ASSERT(!IsEnabled()); | 261 ASSERT(!IsEnabled()); |
258 output_buffer_ = new LogDynamicBuffer( | 262 output_buffer_ = new LogDynamicBuffer( |
259 kDynamicBufferBlockSize, kMaxDynamicBufferSize, | 263 kDynamicBufferBlockSize, kMaxDynamicBufferSize, |
260 kDynamicBufferSeal, StrLength(kDynamicBufferSeal)); | 264 kDynamicBufferSeal, StrLength(kDynamicBufferSeal)); |
261 write_to_file_ = false; | 265 write_to_file_ = false; |
262 } | 266 } |
263 | 267 |
264 | 268 |
265 void Log::Close() { | 269 void Log::Close() { |
266 if (write_to_file_) { | 270 if (write_to_file_) { |
267 if (output_handle_ != NULL) fclose(output_handle_); | 271 if (output_handle_ != NULL) fclose(output_handle_); |
268 output_handle_ = NULL; | 272 output_handle_ = NULL; |
269 if (output_code_handle_ != NULL) fclose(output_code_handle_); | 273 if (ll_output_handle_ != NULL) fclose(ll_output_handle_); |
270 output_code_handle_ = NULL; | 274 ll_output_handle_ = NULL; |
271 } else { | 275 } else { |
272 delete output_buffer_; | 276 delete output_buffer_; |
273 output_buffer_ = NULL; | 277 output_buffer_ = NULL; |
274 } | 278 } |
275 | 279 |
276 DeleteArray(message_buffer_); | 280 DeleteArray(message_buffer_); |
277 message_buffer_ = NULL; | 281 message_buffer_ = NULL; |
278 | 282 |
279 delete mutex_; | 283 delete mutex_; |
280 mutex_ = NULL; | 284 mutex_ = NULL; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 } | 358 } |
355 } | 359 } |
356 | 360 |
357 | 361 |
358 void LogMessageBuilder::AppendAddress(Address addr) { | 362 void LogMessageBuilder::AppendAddress(Address addr) { |
359 Append("0x%" V8PRIxPTR, addr); | 363 Append("0x%" V8PRIxPTR, addr); |
360 } | 364 } |
361 | 365 |
362 | 366 |
363 void LogMessageBuilder::AppendDetailed(String* str, bool show_impl_info) { | 367 void LogMessageBuilder::AppendDetailed(String* str, bool show_impl_info) { |
| 368 if (str == NULL) return; |
364 AssertNoAllocation no_heap_allocation; // Ensure string stay valid. | 369 AssertNoAllocation no_heap_allocation; // Ensure string stay valid. |
365 int len = str->length(); | 370 int len = str->length(); |
366 if (len > 0x1000) | 371 if (len > 0x1000) |
367 len = 0x1000; | 372 len = 0x1000; |
368 if (show_impl_info) { | 373 if (show_impl_info) { |
369 Append(str->IsAsciiRepresentation() ? 'a' : '2'); | 374 Append(str->IsAsciiRepresentation() ? 'a' : '2'); |
370 if (StringShape(str).IsExternal()) | 375 if (StringShape(str).IsExternal()) |
371 Append('e'); | 376 Append('e'); |
372 if (StringShape(str).IsSymbol()) | 377 if (StringShape(str).IsSymbol()) |
373 Append('#'); | 378 Append('#'); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 if (written != pos_) { | 419 if (written != pos_) { |
415 log_->stop(); | 420 log_->stop(); |
416 log_->logger_->LogFailure(); | 421 log_->logger_->LogFailure(); |
417 } | 422 } |
418 } | 423 } |
419 | 424 |
420 | 425 |
421 #endif // ENABLE_LOGGING_AND_PROFILING | 426 #endif // ENABLE_LOGGING_AND_PROFILING |
422 | 427 |
423 } } // namespace v8::internal | 428 } } // namespace v8::internal |
OLD | NEW |