Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: base/logging.cc

Issue 21216: Change the behavior of --enable-dcheck from crashing (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« base/logging.h ('K') | « base/logging.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/logging.h" 5 #include "base/logging.h"
6 6
7 #if defined(OS_WIN) 7 #if defined(OS_WIN)
8 #include <windows.h> 8 #include <windows.h>
9 typedef HANDLE FileHandle; 9 typedef HANDLE FileHandle;
10 typedef HANDLE MutexHandle; 10 typedef HANDLE MutexHandle;
(...skipping 28 matching lines...) Expand all
39 #include "base/lock_impl.h" 39 #include "base/lock_impl.h"
40 #include "base/string_piece.h" 40 #include "base/string_piece.h"
41 #include "base/string_util.h" 41 #include "base/string_util.h"
42 #include "base/sys_string_conversions.h" 42 #include "base/sys_string_conversions.h"
43 43
44 namespace logging { 44 namespace logging {
45 45
46 bool g_enable_dcheck = false; 46 bool g_enable_dcheck = false;
47 47
48 const char* const log_severity_names[LOG_NUM_SEVERITIES] = { 48 const char* const log_severity_names[LOG_NUM_SEVERITIES] = {
49 "INFO", "WARNING", "ERROR", "FATAL" }; 49 "INFO", "WARNING", "ERROR", "ERROR_REPORT", "FATAL" };
50 50
51 int min_log_level = 0; 51 int min_log_level = 0;
52 LogLockingState lock_log_file = LOCK_LOG_FILE; 52 LogLockingState lock_log_file = LOCK_LOG_FILE;
53 53
54 // The default set here for logging_destination will only be used if 54 // The default set here for logging_destination will only be used if
55 // InitLogging is not called. On Windows, use a file next to the exe; 55 // InitLogging is not called. On Windows, use a file next to the exe;
56 // on POSIX platforms, where it may not even be possible to locate the 56 // on POSIX platforms, where it may not even be possible to locate the
57 // executable on disk, use stderr. 57 // executable on disk, use stderr.
58 #if defined(OS_WIN) 58 #if defined(OS_WIN)
59 LoggingDestination logging_destination = LOG_ONLY_TO_FILE; 59 LoggingDestination logging_destination = LOG_ONLY_TO_FILE;
(...skipping 22 matching lines...) Expand all
82 // this file is lazily opened and the handle may be NULL 82 // this file is lazily opened and the handle may be NULL
83 FileHandle log_file = NULL; 83 FileHandle log_file = NULL;
84 84
85 // what should be prepended to each message? 85 // what should be prepended to each message?
86 bool log_process_id = false; 86 bool log_process_id = false;
87 bool log_thread_id = false; 87 bool log_thread_id = false;
88 bool log_timestamp = true; 88 bool log_timestamp = true;
89 bool log_tickcount = false; 89 bool log_tickcount = false;
90 90
91 // An assert handler override specified by the client to be called instead of 91 // An assert handler override specified by the client to be called instead of
92 // the debug message dialog and process termination.
93 LogAssertHandlerFunction log_assert_handler = NULL;
94 // An report handler override specified by the client to be called instead of
wtc 2009/02/19 01:32:04 Nit: add a blank line above this line.
92 // the debug message dialog. 95 // the debug message dialog.
93 LogAssertHandlerFunction log_assert_handler = NULL; 96 LogReportHandlerFunction log_report_handler = NULL;
94 97
95 // The lock is used if log file locking is false. It helps us avoid problems 98 // The lock is used if log file locking is false. It helps us avoid problems
96 // with multiple threads writing to the log file at the same time. Use 99 // with multiple threads writing to the log file at the same time. Use
97 // LockImpl directly instead of using Lock, because Lock makes logging calls. 100 // LockImpl directly instead of using Lock, because Lock makes logging calls.
98 static LockImpl* log_lock = NULL; 101 static LockImpl* log_lock = NULL;
99 102
100 // When we don't use a lock, we are using a global mutex. We need to do this 103 // When we don't use a lock, we are using a global mutex. We need to do this
101 // because LockFileEx is not thread safe. 104 // because LockFileEx is not thread safe.
102 #if defined(OS_WIN) 105 #if defined(OS_WIN)
103 MutexHandle log_mutex = NULL; 106 MutexHandle log_mutex = NULL;
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 log_process_id = enable_process_id; 287 log_process_id = enable_process_id;
285 log_thread_id = enable_thread_id; 288 log_thread_id = enable_thread_id;
286 log_timestamp = enable_timestamp; 289 log_timestamp = enable_timestamp;
287 log_tickcount = enable_tickcount; 290 log_tickcount = enable_tickcount;
288 } 291 }
289 292
290 void SetLogAssertHandler(LogAssertHandlerFunction handler) { 293 void SetLogAssertHandler(LogAssertHandlerFunction handler) {
291 log_assert_handler = handler; 294 log_assert_handler = handler;
292 } 295 }
293 296
297 void SetLogReportHandler(LogReportHandlerFunction handler) {
298 log_report_handler = handler;
299 }
300
294 // Displays a message box to the user with the error message in it. For 301 // Displays a message box to the user with the error message in it. For
295 // Windows programs, it's possible that the message loop is messed up on 302 // Windows programs, it's possible that the message loop is messed up on
296 // a fatal error, and creating a MessageBox will cause that message loop 303 // a fatal error, and creating a MessageBox will cause that message loop
297 // to be run. Instead, we try to spawn another process that displays its 304 // to be run. Instead, we try to spawn another process that displays its
298 // command line. We look for "Debug Message.exe" in the same directory as 305 // command line. We look for "Debug Message.exe" in the same directory as
299 // the application. If it exists, we use it, otherwise, we use a regular 306 // the application. If it exists, we use it, otherwise, we use a regular
300 // message box. 307 // message box.
301 void DisplayDebugMessage(const std::string& str) { 308 void DisplayDebugMessage(const std::string& str) {
302 if (str.empty()) 309 if (str.empty())
303 return; 310 return;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 : severity_(severity) { 348 : severity_(severity) {
342 Init(file, line); 349 Init(file, line);
343 } 350 }
344 351
345 LogMessage::LogMessage(const char* file, int line, const CheckOpString& result) 352 LogMessage::LogMessage(const char* file, int line, const CheckOpString& result)
346 : severity_(LOG_FATAL) { 353 : severity_(LOG_FATAL) {
347 Init(file, line); 354 Init(file, line);
348 stream_ << "Check failed: " << (*result.str_); 355 stream_ << "Check failed: " << (*result.str_);
349 } 356 }
350 357
358 LogMessage::LogMessage(const char* file, int line, LogSeverity severity,
359 const CheckOpString& result)
360 : severity_(severity) {
361 Init(file, line);
362 stream_ << "Check failed: " << (*result.str_);
363 }
364
351 LogMessage::LogMessage(const char* file, int line) 365 LogMessage::LogMessage(const char* file, int line)
352 : severity_(LOG_INFO) { 366 : severity_(LOG_INFO) {
353 Init(file, line); 367 Init(file, line);
354 } 368 }
355 369
356 LogMessage::LogMessage(const char* file, int line, LogSeverity severity) 370 LogMessage::LogMessage(const char* file, int line, LogSeverity severity)
357 : severity_(severity) { 371 : severity_(severity) {
358 Init(file, line); 372 Init(file, line);
359 } 373 }
360 374
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 // hosed can cause additional problems. 518 // hosed can cause additional problems.
505 #ifndef NDEBUG 519 #ifndef NDEBUG
506 DisplayDebugMessage(stream_.str()); 520 DisplayDebugMessage(stream_.str());
507 #endif 521 #endif
508 // Crash the process to generate a dump. 522 // Crash the process to generate a dump.
509 DebugUtil::BreakDebugger(); 523 DebugUtil::BreakDebugger();
510 // TODO(mmentovai): when we have breakpad support, generate a breakpad 524 // TODO(mmentovai): when we have breakpad support, generate a breakpad
511 // dump, but until then, do not invoke the Apple crash reporter. 525 // dump, but until then, do not invoke the Apple crash reporter.
512 } 526 }
513 } 527 }
528 } else if (severity_ == LOG_ERROR_REPORT) {
529 // We are here only if the user runs with --enable-dcheck in release mode.
530 if (log_report_handler) {
531 log_report_handler(std::string(stream_.str()));
532 } else {
533 DisplayDebugMessage(stream_.str());
534 }
514 } 535 }
515 } 536 }
516 537
517 void CloseLogFile() { 538 void CloseLogFile() {
518 if (!log_file) 539 if (!log_file)
519 return; 540 return;
520 541
521 CloseFile(log_file); 542 CloseFile(log_file);
522 log_file = NULL; 543 log_file = NULL;
523 } 544 }
524 545
525 } // namespace logging 546 } // namespace logging
526 547
527 std::ostream& operator<<(std::ostream& out, const wchar_t* wstr) { 548 std::ostream& operator<<(std::ostream& out, const wchar_t* wstr) {
528 return out << base::SysWideToUTF8(std::wstring(wstr)); 549 return out << base::SysWideToUTF8(std::wstring(wstr));
529 } 550 }
OLDNEW
« base/logging.h ('K') | « base/logging.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698