Change the behavior of --enable-dcheck in release
build from crashing to logging the failure and
continuing. In addition,
- In interactive mode, we will display a message
box so the user can either click OK and continue
or attach a debugger.
- If Chrome is running in test environment, it
has the option to overide the default behavior
and suppress the error dialog.
To support this, a new severity level ERROR_REPORT
is added.
In addition, DFATAL is now mapped to ERROR_REPORT
instead of ERROR. The only usage of DFATAL is in
ssl_client_socket_nss.cc. Add wtc for code review.
Review URL: http://codereview.chromium.org/21216
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@9633 0039d316-1c4b-4281-b951-d872f2087c98
CrOS-Libchrome-Original-Commit: fb62a5370cdd2626eae72bb8ba883287b28e830c
diff --git a/base/logging.cc b/base/logging.cc
index cc9c7db..4daefcd 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -46,7 +46,7 @@
bool g_enable_dcheck = false;
const char* const log_severity_names[LOG_NUM_SEVERITIES] = {
- "INFO", "WARNING", "ERROR", "FATAL" };
+ "INFO", "WARNING", "ERROR", "ERROR_REPORT", "FATAL" };
int min_log_level = 0;
LogLockingState lock_log_file = LOCK_LOG_FILE;
@@ -89,8 +89,11 @@
bool log_tickcount = false;
// An assert handler override specified by the client to be called instead of
-// the debug message dialog.
+// the debug message dialog and process termination.
LogAssertHandlerFunction log_assert_handler = NULL;
+// An report handler override specified by the client to be called instead of
+// the debug message dialog.
+LogReportHandlerFunction log_report_handler = NULL;
// The lock is used if log file locking is false. It helps us avoid problems
// with multiple threads writing to the log file at the same time. Use
@@ -291,6 +294,10 @@
log_assert_handler = handler;
}
+void SetLogReportHandler(LogReportHandlerFunction handler) {
+ log_report_handler = handler;
+}
+
// Displays a message box to the user with the error message in it. For
// Windows programs, it's possible that the message loop is messed up on
// a fatal error, and creating a MessageBox will cause that message loop
@@ -348,6 +355,13 @@
stream_ << "Check failed: " << (*result.str_);
}
+LogMessage::LogMessage(const char* file, int line, LogSeverity severity,
+ const CheckOpString& result)
+ : severity_(severity) {
+ Init(file, line);
+ stream_ << "Check failed: " << (*result.str_);
+}
+
LogMessage::LogMessage(const char* file, int line)
: severity_(LOG_INFO) {
Init(file, line);
@@ -511,6 +525,13 @@
// dump, but until then, do not invoke the Apple crash reporter.
}
}
+ } else if (severity_ == LOG_ERROR_REPORT) {
+ // We are here only if the user runs with --enable-dcheck in release mode.
+ if (log_report_handler) {
+ log_report_handler(std::string(stream_.str()));
+ } else {
+ DisplayDebugMessage(stream_.str());
+ }
}
}