| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <io.h> | 8 #include <io.h> |
| 9 #include <windows.h> | 9 #include <windows.h> |
| 10 typedef HANDLE FileHandle; | 10 typedef HANDLE FileHandle; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 #endif | 67 #endif |
| 68 | 68 |
| 69 namespace logging { | 69 namespace logging { |
| 70 | 70 |
| 71 namespace { | 71 namespace { |
| 72 | 72 |
| 73 VlogInfo* g_vlog_info = NULL; | 73 VlogInfo* g_vlog_info = NULL; |
| 74 VlogInfo* g_vlog_info_prev = NULL; | 74 VlogInfo* g_vlog_info_prev = NULL; |
| 75 | 75 |
| 76 const char* const log_severity_names[LOG_NUM_SEVERITIES] = { | 76 const char* const log_severity_names[LOG_NUM_SEVERITIES] = { |
| 77 "INFO", "WARNING", "ERROR", "ERROR_REPORT", "FATAL" }; | 77 "INFO", "WARNING", "ERROR", "FATAL" }; |
| 78 | 78 |
| 79 const char* log_severity_name(int severity) | 79 const char* log_severity_name(int severity) |
| 80 { | 80 { |
| 81 if (severity >= 0 && severity < LOG_NUM_SEVERITIES) | 81 if (severity >= 0 && severity < LOG_NUM_SEVERITIES) |
| 82 return log_severity_names[severity]; | 82 return log_severity_names[severity]; |
| 83 return "UNKNOWN"; | 83 return "UNKNOWN"; |
| 84 } | 84 } |
| 85 | 85 |
| 86 int min_log_level = 0; | 86 int min_log_level = 0; |
| 87 | 87 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 108 bool log_thread_id = false; | 108 bool log_thread_id = false; |
| 109 bool log_timestamp = true; | 109 bool log_timestamp = true; |
| 110 bool log_tickcount = false; | 110 bool log_tickcount = false; |
| 111 | 111 |
| 112 // Should we pop up fatal debug messages in a dialog? | 112 // Should we pop up fatal debug messages in a dialog? |
| 113 bool show_error_dialogs = false; | 113 bool show_error_dialogs = false; |
| 114 | 114 |
| 115 // An assert handler override specified by the client to be called instead of | 115 // An assert handler override specified by the client to be called instead of |
| 116 // the debug message dialog and process termination. | 116 // the debug message dialog and process termination. |
| 117 LogAssertHandlerFunction log_assert_handler = NULL; | 117 LogAssertHandlerFunction log_assert_handler = NULL; |
| 118 // An report handler override specified by the client to be called instead of | |
| 119 // the debug message dialog. | |
| 120 LogReportHandlerFunction log_report_handler = NULL; | |
| 121 // A log message handler that gets notified of every log message we process. | 118 // A log message handler that gets notified of every log message we process. |
| 122 LogMessageHandlerFunction log_message_handler = NULL; | 119 LogMessageHandlerFunction log_message_handler = NULL; |
| 123 | 120 |
| 124 // Helper functions to wrap platform differences. | 121 // Helper functions to wrap platform differences. |
| 125 | 122 |
| 126 int32 CurrentProcessId() { | 123 int32 CurrentProcessId() { |
| 127 #if defined(OS_WIN) | 124 #if defined(OS_WIN) |
| 128 return GetCurrentProcessId(); | 125 return GetCurrentProcessId(); |
| 129 #elif defined(OS_POSIX) | 126 #elif defined(OS_POSIX) |
| 130 return getpid(); | 127 return getpid(); |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 if (!log_file_name) | 392 if (!log_file_name) |
| 396 log_file_name = new PathString(); | 393 log_file_name = new PathString(); |
| 397 *log_file_name = settings.log_file; | 394 *log_file_name = settings.log_file; |
| 398 if (settings.delete_old == DELETE_OLD_LOG_FILE) | 395 if (settings.delete_old == DELETE_OLD_LOG_FILE) |
| 399 DeleteFilePath(*log_file_name); | 396 DeleteFilePath(*log_file_name); |
| 400 | 397 |
| 401 return InitializeLogFileHandle(); | 398 return InitializeLogFileHandle(); |
| 402 } | 399 } |
| 403 | 400 |
| 404 void SetMinLogLevel(int level) { | 401 void SetMinLogLevel(int level) { |
| 405 min_log_level = std::min(LOG_ERROR_REPORT, level); | 402 min_log_level = std::min(LOG_FATAL, level); |
| 406 } | 403 } |
| 407 | 404 |
| 408 int GetMinLogLevel() { | 405 int GetMinLogLevel() { |
| 409 return min_log_level; | 406 return min_log_level; |
| 410 } | 407 } |
| 411 | 408 |
| 412 int GetVlogVerbosity() { | 409 int GetVlogVerbosity() { |
| 413 return std::max(-1, LOG_INFO - GetMinLogLevel()); | 410 return std::max(-1, LOG_INFO - GetMinLogLevel()); |
| 414 } | 411 } |
| 415 | 412 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 432 } | 429 } |
| 433 | 430 |
| 434 void SetShowErrorDialogs(bool enable_dialogs) { | 431 void SetShowErrorDialogs(bool enable_dialogs) { |
| 435 show_error_dialogs = enable_dialogs; | 432 show_error_dialogs = enable_dialogs; |
| 436 } | 433 } |
| 437 | 434 |
| 438 void SetLogAssertHandler(LogAssertHandlerFunction handler) { | 435 void SetLogAssertHandler(LogAssertHandlerFunction handler) { |
| 439 log_assert_handler = handler; | 436 log_assert_handler = handler; |
| 440 } | 437 } |
| 441 | 438 |
| 442 void SetLogReportHandler(LogReportHandlerFunction handler) { | |
| 443 log_report_handler = handler; | |
| 444 } | |
| 445 | |
| 446 void SetLogMessageHandler(LogMessageHandlerFunction handler) { | 439 void SetLogMessageHandler(LogMessageHandlerFunction handler) { |
| 447 log_message_handler = handler; | 440 log_message_handler = handler; |
| 448 } | 441 } |
| 449 | 442 |
| 450 LogMessageHandlerFunction GetLogMessageHandler() { | 443 LogMessageHandlerFunction GetLogMessageHandler() { |
| 451 return log_message_handler; | 444 return log_message_handler; |
| 452 } | 445 } |
| 453 | 446 |
| 454 // MSVC doesn't like complex extern templates and DLLs. | 447 // MSVC doesn't like complex extern templates and DLLs. |
| 455 #if !defined(COMPILER_MSVC) | 448 #if !defined(COMPILER_MSVC) |
| 456 // Explicit instantiations for commonly used comparisons. | 449 // Explicit instantiations for commonly used comparisons. |
| 457 template std::string* MakeCheckOpString<int, int>( | 450 template std::string* MakeCheckOpString<int, int>( |
| 458 const int&, const int&, const char* names); | 451 const int&, const int&, const char* names); |
| 459 template std::string* MakeCheckOpString<unsigned long, unsigned long>( | 452 template std::string* MakeCheckOpString<unsigned long, unsigned long>( |
| 460 const unsigned long&, const unsigned long&, const char* names); | 453 const unsigned long&, const unsigned long&, const char* names); |
| 461 template std::string* MakeCheckOpString<unsigned long, unsigned int>( | 454 template std::string* MakeCheckOpString<unsigned long, unsigned int>( |
| 462 const unsigned long&, const unsigned int&, const char* names); | 455 const unsigned long&, const unsigned int&, const char* names); |
| 463 template std::string* MakeCheckOpString<unsigned int, unsigned long>( | 456 template std::string* MakeCheckOpString<unsigned int, unsigned long>( |
| 464 const unsigned int&, const unsigned long&, const char* names); | 457 const unsigned int&, const unsigned long&, const char* names); |
| 465 template std::string* MakeCheckOpString<std::string, std::string>( | 458 template std::string* MakeCheckOpString<std::string, std::string>( |
| 466 const std::string&, const std::string&, const char* name); | 459 const std::string&, const std::string&, const char* name); |
| 467 #endif | 460 #endif |
| 468 | 461 |
| 462 #if !defined(NDEBUG) |
| 469 // Displays a message box to the user with the error message in it. | 463 // Displays a message box to the user with the error message in it. |
| 470 // Used for fatal messages, where we close the app simultaneously. | 464 // Used for fatal messages, where we close the app simultaneously. |
| 471 // This is for developers only; we don't use this in circumstances | 465 // This is for developers only; we don't use this in circumstances |
| 472 // (like release builds) where users could see it, since users don't | 466 // (like release builds) where users could see it, since users don't |
| 473 // understand these messages anyway. | 467 // understand these messages anyway. |
| 474 void DisplayDebugMessageInDialog(const std::string& str) { | 468 void DisplayDebugMessageInDialog(const std::string& str) { |
| 475 if (str.empty()) | 469 if (str.empty()) |
| 476 return; | 470 return; |
| 477 | 471 |
| 478 if (!show_error_dialogs) | 472 if (!show_error_dialogs) |
| (...skipping 30 matching lines...) Expand all Loading... |
| 509 } else { | 503 } else { |
| 510 // debug process broken, let's just do a message box | 504 // debug process broken, let's just do a message box |
| 511 MessageBoxW(NULL, &cmdline[0], L"Fatal error", | 505 MessageBoxW(NULL, &cmdline[0], L"Fatal error", |
| 512 MB_OK | MB_ICONHAND | MB_TOPMOST); | 506 MB_OK | MB_ICONHAND | MB_TOPMOST); |
| 513 } | 507 } |
| 514 #else | 508 #else |
| 515 // We intentionally don't implement a dialog on other platforms. | 509 // We intentionally don't implement a dialog on other platforms. |
| 516 // You can just look at stderr. | 510 // You can just look at stderr. |
| 517 #endif | 511 #endif |
| 518 } | 512 } |
| 513 #endif // !defined(NDEBUG) |
| 519 | 514 |
| 520 #if defined(OS_WIN) | 515 #if defined(OS_WIN) |
| 521 LogMessage::SaveLastError::SaveLastError() : last_error_(::GetLastError()) { | 516 LogMessage::SaveLastError::SaveLastError() : last_error_(::GetLastError()) { |
| 522 } | 517 } |
| 523 | 518 |
| 524 LogMessage::SaveLastError::~SaveLastError() { | 519 LogMessage::SaveLastError::~SaveLastError() { |
| 525 ::SetLastError(last_error_); | 520 ::SetLastError(last_error_); |
| 526 } | 521 } |
| 527 #endif // defined(OS_WIN) | 522 #endif // defined(OS_WIN) |
| 528 | 523 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 android_LogPriority priority = | 579 android_LogPriority priority = |
| 585 (severity_ < 0) ? ANDROID_LOG_VERBOSE : ANDROID_LOG_UNKNOWN; | 580 (severity_ < 0) ? ANDROID_LOG_VERBOSE : ANDROID_LOG_UNKNOWN; |
| 586 switch (severity_) { | 581 switch (severity_) { |
| 587 case LOG_INFO: | 582 case LOG_INFO: |
| 588 priority = ANDROID_LOG_INFO; | 583 priority = ANDROID_LOG_INFO; |
| 589 break; | 584 break; |
| 590 case LOG_WARNING: | 585 case LOG_WARNING: |
| 591 priority = ANDROID_LOG_WARN; | 586 priority = ANDROID_LOG_WARN; |
| 592 break; | 587 break; |
| 593 case LOG_ERROR: | 588 case LOG_ERROR: |
| 594 case LOG_ERROR_REPORT: | |
| 595 priority = ANDROID_LOG_ERROR; | 589 priority = ANDROID_LOG_ERROR; |
| 596 break; | 590 break; |
| 597 case LOG_FATAL: | 591 case LOG_FATAL: |
| 598 priority = ANDROID_LOG_FATAL; | 592 priority = ANDROID_LOG_FATAL; |
| 599 break; | 593 break; |
| 600 } | 594 } |
| 601 __android_log_write(priority, "chromium", str_newline.c_str()); | 595 __android_log_write(priority, "chromium", str_newline.c_str()); |
| 602 #endif | 596 #endif |
| 603 ignore_result(fwrite(str_newline.data(), str_newline.size(), 1, stderr)); | 597 ignore_result(fwrite(str_newline.data(), str_newline.size(), 1, stderr)); |
| 604 fflush(stderr); | 598 fflush(stderr); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 // the debug message process. We also don't display assertions to the | 647 // the debug message process. We also don't display assertions to the |
| 654 // user in release mode. The enduser can't do anything with this | 648 // user in release mode. The enduser can't do anything with this |
| 655 // information, and displaying message boxes when the application is | 649 // information, and displaying message boxes when the application is |
| 656 // hosed can cause additional problems. | 650 // hosed can cause additional problems. |
| 657 #ifndef NDEBUG | 651 #ifndef NDEBUG |
| 658 DisplayDebugMessageInDialog(stream_.str()); | 652 DisplayDebugMessageInDialog(stream_.str()); |
| 659 #endif | 653 #endif |
| 660 // Crash the process to generate a dump. | 654 // Crash the process to generate a dump. |
| 661 base::debug::BreakDebugger(); | 655 base::debug::BreakDebugger(); |
| 662 } | 656 } |
| 663 } else if (severity_ == LOG_ERROR_REPORT) { | |
| 664 // We are here only if the user runs with --enable-dcheck in release mode. | |
| 665 if (log_report_handler) { | |
| 666 log_report_handler(std::string(stream_.str())); | |
| 667 } else { | |
| 668 DisplayDebugMessageInDialog(stream_.str()); | |
| 669 } | |
| 670 } | 657 } |
| 671 } | 658 } |
| 672 | 659 |
| 673 // writes the common header info to the stream | 660 // writes the common header info to the stream |
| 674 void LogMessage::Init(const char* file, int line) { | 661 void LogMessage::Init(const char* file, int line) { |
| 675 base::StringPiece filename(file); | 662 base::StringPiece filename(file); |
| 676 size_t last_slash_pos = filename.find_last_of("\\/"); | 663 size_t last_slash_pos = filename.find_last_of("\\/"); |
| 677 if (last_slash_pos != base::StringPiece::npos) | 664 if (last_slash_pos != base::StringPiece::npos) |
| 678 filename.remove_prefix(last_slash_pos + 1); | 665 filename.remove_prefix(last_slash_pos + 1); |
| 679 | 666 |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 830 return *log_file_name; | 817 return *log_file_name; |
| 831 return std::wstring(); | 818 return std::wstring(); |
| 832 } | 819 } |
| 833 #endif | 820 #endif |
| 834 | 821 |
| 835 } // namespace logging | 822 } // namespace logging |
| 836 | 823 |
| 837 std::ostream& operator<<(std::ostream& out, const wchar_t* wstr) { | 824 std::ostream& operator<<(std::ostream& out, const wchar_t* wstr) { |
| 838 return out << base::WideToUTF8(std::wstring(wstr)); | 825 return out << base::WideToUTF8(std::wstring(wstr)); |
| 839 } | 826 } |
| OLD | NEW |