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

Side by Side Diff: base/logging.h

Issue 2288473002: Implement Dump-on-DCHECK (via a new LogSeverity). (Closed)
Patch Set: Pull the Official Windows build default in, and rebase Created 3 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
« no previous file with comments | « base/allocator/partition_allocator/partition_alloc.h ('k') | base/logging.cc » ('j') | 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) 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 #ifndef BASE_LOGGING_H_ 5 #ifndef BASE_LOGGING_H_
6 #define BASE_LOGGING_H_ 6 #define BASE_LOGGING_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include <cassert> 10 #include <cassert>
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 BASE_EXPORT LogMessageHandlerFunction GetLogMessageHandler(); 290 BASE_EXPORT LogMessageHandlerFunction GetLogMessageHandler();
291 291
292 typedef int LogSeverity; 292 typedef int LogSeverity;
293 const LogSeverity LOG_VERBOSE = -1; // This is level 1 verbosity 293 const LogSeverity LOG_VERBOSE = -1; // This is level 1 verbosity
294 // Note: the log severities are used to index into the array of names, 294 // Note: the log severities are used to index into the array of names,
295 // see log_severity_names. 295 // see log_severity_names.
296 const LogSeverity LOG_INFO = 0; 296 const LogSeverity LOG_INFO = 0;
297 const LogSeverity LOG_WARNING = 1; 297 const LogSeverity LOG_WARNING = 1;
298 const LogSeverity LOG_ERROR = 2; 298 const LogSeverity LOG_ERROR = 2;
299 const LogSeverity LOG_FATAL = 3; 299 const LogSeverity LOG_FATAL = 3;
300 const LogSeverity LOG_NUM_SEVERITIES = 4; 300 const LogSeverity LOG_DUMP = 4;
301 const LogSeverity LOG_NUM_SEVERITIES = 5;
301 302
302 // LOG_DFATAL is LOG_FATAL in debug mode, ERROR in normal mode 303 // LOG_DFATAL is LOG_FATAL in debug mode, ERROR in normal mode
303 #ifdef NDEBUG 304 #if defined(DCHECK_IS_DUMP_WITHOUT_CRASH)
305 const LogSeverity LOG_DFATAL = LOG_DUMP;
306 #elif NDEBUG
304 const LogSeverity LOG_DFATAL = LOG_ERROR; 307 const LogSeverity LOG_DFATAL = LOG_ERROR;
305 #else 308 #else
306 const LogSeverity LOG_DFATAL = LOG_FATAL; 309 const LogSeverity LOG_DFATAL = LOG_FATAL;
307 #endif 310 #endif
308 311
309 // A few definitions of macros that don't generate much code. These are used 312 // A few definitions of macros that don't generate much code. These are used
310 // by LOG() and LOG_IF, etc. Since these are used all over our code, it's 313 // by LOG() and LOG_IF, etc. Since these are used all over our code, it's
311 // better to have compact code for these operations. 314 // better to have compact code for these operations.
312 #define COMPACT_GOOGLE_LOG_EX_INFO(ClassName, ...) \ 315 #define COMPACT_GOOGLE_LOG_EX_INFO(ClassName, ...) \
313 ::logging::ClassName(__FILE__, __LINE__, ::logging::LOG_INFO, ##__VA_ARGS__) 316 ::logging::ClassName(__FILE__, __LINE__, ::logging::LOG_INFO, ##__VA_ARGS__)
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 690
688 #define DVLOG(verboselevel) DVLOG_IF(verboselevel, VLOG_IS_ON(verboselevel)) 691 #define DVLOG(verboselevel) DVLOG_IF(verboselevel, VLOG_IS_ON(verboselevel))
689 692
690 #define DVPLOG(verboselevel) DVPLOG_IF(verboselevel, VLOG_IS_ON(verboselevel)) 693 #define DVPLOG(verboselevel) DVPLOG_IF(verboselevel, VLOG_IS_ON(verboselevel))
691 694
692 // Definitions for DCHECK et al. 695 // Definitions for DCHECK et al.
693 696
694 #if DCHECK_IS_ON() 697 #if DCHECK_IS_ON()
695 698
696 #define COMPACT_GOOGLE_LOG_EX_DCHECK(ClassName, ...) \ 699 #define COMPACT_GOOGLE_LOG_EX_DCHECK(ClassName, ...) \
697 COMPACT_GOOGLE_LOG_EX_FATAL(ClassName , ##__VA_ARGS__) 700 COMPACT_GOOGLE_LOG_EX_DFATAL(ClassName, ##__VA_ARGS__)
698 #define COMPACT_GOOGLE_LOG_DCHECK COMPACT_GOOGLE_LOG_FATAL 701 #define COMPACT_GOOGLE_LOG_DCHECK COMPACT_GOOGLE_LOG_DFATAL
699 const LogSeverity LOG_DCHECK = LOG_FATAL; 702 const LogSeverity LOG_DCHECK = LOG_DFATAL;
700 703
701 #else // DCHECK_IS_ON() 704 #else // DCHECK_IS_ON()
702 705
703 // These are just dummy values. 706 // These are just dummy values.
704 #define COMPACT_GOOGLE_LOG_EX_DCHECK(ClassName, ...) \ 707 #define COMPACT_GOOGLE_LOG_EX_DCHECK(ClassName, ...) \
705 COMPACT_GOOGLE_LOG_EX_INFO(ClassName , ##__VA_ARGS__) 708 COMPACT_GOOGLE_LOG_EX_INFO(ClassName , ##__VA_ARGS__)
706 #define COMPACT_GOOGLE_LOG_DCHECK COMPACT_GOOGLE_LOG_INFO 709 #define COMPACT_GOOGLE_LOG_DCHECK COMPACT_GOOGLE_LOG_INFO
707 const LogSeverity LOG_DCHECK = LOG_INFO; 710 const LogSeverity LOG_DCHECK = LOG_INFO;
708 711
709 #endif // DCHECK_IS_ON() 712 #endif // DCHECK_IS_ON()
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 LOG_STREAM(DCHECK), \ 746 LOG_STREAM(DCHECK), \
744 DCHECK_IS_ON() ? (logging::AnalyzerNoReturn() || !(condition)) : false) \ 747 DCHECK_IS_ON() ? (logging::AnalyzerNoReturn() || !(condition)) : false) \
745 << "Check failed: " #condition ". " 748 << "Check failed: " #condition ". "
746 749
747 #define DPCHECK(condition) \ 750 #define DPCHECK(condition) \
748 LAZY_STREAM( \ 751 LAZY_STREAM( \
749 PLOG_STREAM(DCHECK), \ 752 PLOG_STREAM(DCHECK), \
750 DCHECK_IS_ON() ? (logging::AnalyzerNoReturn() || !(condition)) : false) \ 753 DCHECK_IS_ON() ? (logging::AnalyzerNoReturn() || !(condition)) : false) \
751 << "Check failed: " #condition ". " 754 << "Check failed: " #condition ". "
752 755
753 #else 756 #elif DCHECK_IS_ON() && defined(DCHECK_IS_DUMP_WITHOUT_CRASH)
757 // DCHECK is configured to dump-without-crashing, rather than logging.
758 // Since we only intend to enable this in official builds, we follow the
759 // example of CHECK_OP etc in official builds, and strip out logging.
760 // See crbug.com/596231.
761
762 BASE_EXPORT void DCheckDumpWithoutCrashing();
763
764 #define DCHECK(condition) \
765 !(condition) ? ::logging::DCheckDumpWithoutCrashing() : EAT_STREAM_PARAMETERS
766
767 #define DPCHECK(condition) DCHECK(condition)
768
769 #else // DCHECK_IS_ON() && defined(DCHECK_IS_DUMP_WITHOUT_CRASH)
754 770
755 #if DCHECK_IS_ON() 771 #if DCHECK_IS_ON()
756 772
757 #define DCHECK(condition) \ 773 #define DCHECK(condition) \
758 LAZY_STREAM(LOG_STREAM(DCHECK), !(condition)) \ 774 LAZY_STREAM(LOG_STREAM(DCHECK), !(condition)) \
759 << "Check failed: " #condition ". " 775 << "Check failed: " #condition ". "
760 #define DPCHECK(condition) \ 776 #define DPCHECK(condition) \
761 LAZY_STREAM(PLOG_STREAM(DCHECK), !(condition)) \ 777 LAZY_STREAM(PLOG_STREAM(DCHECK), !(condition)) \
762 << "Check failed: " #condition ". " 778 << "Check failed: " #condition ". "
763 779
764 #else // DCHECK_IS_ON() 780 #else // DCHECK_IS_ON()
765 781
766 #define DCHECK(condition) EAT_STREAM_PARAMETERS << !(condition) 782 #define DCHECK(condition) EAT_STREAM_PARAMETERS << !(condition)
767 #define DPCHECK(condition) EAT_STREAM_PARAMETERS << !(condition) 783 #define DPCHECK(condition) EAT_STREAM_PARAMETERS << !(condition)
768 784
769 #endif // DCHECK_IS_ON() 785 #endif // DCHECK_IS_ON()
770 786
771 #endif 787 #endif // _PREFAST_
772 788
773 // Helper macro for binary operators. 789 // Helper macro for binary operators.
774 // Don't use this macro directly in your code, use DCHECK_EQ et al below. 790 // Don't use this macro directly in your code, use DCHECK_EQ et al below.
775 // The 'switch' is used to prevent the 'else' from being ambiguous when the 791 // The 'switch' is used to prevent the 'else' from being ambiguous when the
776 // macro is used in an 'if' clause such as: 792 // macro is used in an 'if' clause such as:
777 // if (a == 1) 793 // if (a == 1)
778 // DCHECK_EQ(2, a); 794 // DCHECK_EQ(2, a);
779 #if DCHECK_IS_ON() 795 #if DCHECK_IS_ON()
780 796
781 #define DCHECK_OP(name, op, val1, val2) \ 797 #define DCHECK_OP(name, op, val1, val2) \
(...skipping 19 matching lines...) Expand all
801 // expansion, this is OK, since the expression is never actually evaluated. 817 // expansion, this is OK, since the expression is never actually evaluated.
802 #define DCHECK_OP(name, op, val1, val2) \ 818 #define DCHECK_OP(name, op, val1, val2) \
803 EAT_STREAM_PARAMETERS << (::logging::MakeCheckOpValueString( \ 819 EAT_STREAM_PARAMETERS << (::logging::MakeCheckOpValueString( \
804 ::logging::g_swallow_stream, val1), \ 820 ::logging::g_swallow_stream, val1), \
805 ::logging::MakeCheckOpValueString( \ 821 ::logging::MakeCheckOpValueString( \
806 ::logging::g_swallow_stream, val2), \ 822 ::logging::g_swallow_stream, val2), \
807 (val1)op(val2)) 823 (val1)op(val2))
808 824
809 #endif // DCHECK_IS_ON() 825 #endif // DCHECK_IS_ON()
810 826
827 #endif // DCHECK_IS_ON() && defined(DCHECK_IS_DUMP_WITHOUT_CRASH)
828
811 // Equality/Inequality checks - compare two values, and log a 829 // Equality/Inequality checks - compare two values, and log a
812 // LOG_DCHECK message including the two values when the result is not 830 // LOG_DCHECK message including the two values when the result is not
813 // as expected. The values must have operator<<(ostream, ...) 831 // as expected. The values must have operator<<(ostream, ...)
814 // defined. 832 // defined.
815 // 833 //
816 // You may append to the error message like so: 834 // You may append to the error message like so:
817 // DCHECK_NE(1, 2) << "The world must be ending!"; 835 // DCHECK_NE(1, 2) << "The world must be ending!";
818 // 836 //
819 // We are very careful to ensure that each argument is evaluated exactly 837 // We are very careful to ensure that each argument is evaluated exactly
820 // once, and that anything which is legal to pass as a function argument is 838 // once, and that anything which is legal to pass as a function argument is
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
1071 #elif NOTIMPLEMENTED_POLICY == 5 1089 #elif NOTIMPLEMENTED_POLICY == 5
1072 #define NOTIMPLEMENTED() do {\ 1090 #define NOTIMPLEMENTED() do {\
1073 static bool logged_once = false;\ 1091 static bool logged_once = false;\
1074 LOG_IF(ERROR, !logged_once) << NOTIMPLEMENTED_MSG;\ 1092 LOG_IF(ERROR, !logged_once) << NOTIMPLEMENTED_MSG;\
1075 logged_once = true;\ 1093 logged_once = true;\
1076 } while(0);\ 1094 } while(0);\
1077 EAT_STREAM_PARAMETERS 1095 EAT_STREAM_PARAMETERS
1078 #endif 1096 #endif
1079 1097
1080 #endif // BASE_LOGGING_H_ 1098 #endif // BASE_LOGGING_H_
OLDNEW
« no previous file with comments | « base/allocator/partition_allocator/partition_alloc.h ('k') | base/logging.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698