Index: base/logging.cc |
diff --git a/base/logging.cc b/base/logging.cc |
index 54756155d1c0b92d2301d8c7d55d940a7b51809b..9fe235cc93546ba779f707522f854f2a28f4d185 100644 |
--- a/base/logging.cc |
+++ b/base/logging.cc |
@@ -43,6 +43,7 @@ typedef pthread_mutex_t* MutexHandle; |
#include <ctime> |
#include <iomanip> |
#include <ostream> |
+#include <string> |
#include "base/base_switches.h" |
#include "base/command_line.h" |
@@ -51,6 +52,8 @@ typedef pthread_mutex_t* MutexHandle; |
#include "base/debug/stack_trace.h" |
#include "base/posix/eintr_wrapper.h" |
#include "base/strings/string_piece.h" |
+#include "base/strings/string_util.h" |
+#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/synchronization/lock_impl.h" |
#include "base/threading/platform_thread.h" |
@@ -729,61 +732,40 @@ SystemErrorCode GetLastSystemErrorCode() { |
} |
#if defined(OS_WIN) |
-Win32ErrorLogMessage::Win32ErrorLogMessage(const char* file, |
- int line, |
- LogSeverity severity, |
- SystemErrorCode err, |
- const char* module) |
- : err_(err), |
- module_(module), |
- log_message_(file, line, severity) { |
+BASE_EXPORT std::string SystemErrorCodeToString(SystemErrorCode error_code) { |
+ const int error_message_buffer_size = 256; |
+ char msgbuf[error_message_buffer_size]; |
+ DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS; |
+ DWORD len = FormatMessageA(flags, NULL, error_code, 0, msgbuf, |
+ arraysize(msgbuf), NULL); |
+ if (len) { |
+ // Messages returned by system end with line breaks. |
+ return base::CollapseWhitespaceASCII(msgbuf, true) + |
+ base::StringPrintf(" (0x%X)", error_code); |
+ } |
+ return base::StringPrintf("Error (0x%X) while retrieving error. (0x%X)", |
+ GetLastError(), error_code); |
} |
+#elif defined(OS_POSIX) |
+BASE_EXPORT std::string SystemErrorCodeToString(SystemErrorCode error_code) { |
+ return safe_strerror(error_code); |
+} |
+#else |
+#error Not implemented |
+#endif |
+ |
+#if defined(OS_WIN) |
Win32ErrorLogMessage::Win32ErrorLogMessage(const char* file, |
int line, |
LogSeverity severity, |
SystemErrorCode err) |
: err_(err), |
- module_(NULL), |
log_message_(file, line, severity) { |
} |
Win32ErrorLogMessage::~Win32ErrorLogMessage() { |
- const int error_message_buffer_size = 256; |
- char msgbuf[error_message_buffer_size]; |
- DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS; |
- HMODULE hmod; |
- if (module_) { |
- hmod = GetModuleHandleA(module_); |
- if (hmod) { |
- flags |= FORMAT_MESSAGE_FROM_HMODULE; |
- } else { |
- // This makes a nested Win32ErrorLogMessage. It will have module_ of NULL |
- // so it will not call GetModuleHandle, so recursive errors are |
- // impossible. |
- DPLOG(WARNING) << "Couldn't open module " << module_ |
- << " for error message query"; |
- } |
- } else { |
- hmod = NULL; |
- } |
- DWORD len = FormatMessageA(flags, |
- hmod, |
- err_, |
- 0, |
- msgbuf, |
- sizeof(msgbuf) / sizeof(msgbuf[0]), |
- NULL); |
- if (len) { |
- while ((len > 0) && |
- isspace(static_cast<unsigned char>(msgbuf[len - 1]))) { |
- msgbuf[--len] = 0; |
- } |
- stream() << ": " << msgbuf; |
- } else { |
- stream() << ": Error " << GetLastError() << " while retrieving error " |
- << err_; |
- } |
+ stream() << ": " << SystemErrorCodeToString(err_); |
// We're about to crash (CHECK). Put |err_| on the stack (by placing it in a |
// field) and use Alias in hopes that it makes it into crash dumps. |
DWORD last_error = err_; |
@@ -799,7 +781,7 @@ ErrnoLogMessage::ErrnoLogMessage(const char* file, |
} |
ErrnoLogMessage::~ErrnoLogMessage() { |
- stream() << ": " << safe_strerror(err_); |
+ stream() << ": " << SystemErrorCodeToString(err_); |
} |
#endif // OS_WIN |