1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_BASE_LOGGING_H 18 #define ANDROID_BASE_LOGGING_H 19 20 // NOTE: For Windows, you must include logging.h after windows.h to allow the 21 // following code to suppress the evil ERROR macro: 22 #ifdef _WIN32 23 // windows.h includes wingdi.h which defines an evil macro ERROR. 24 #ifdef ERROR 25 #undef ERROR 26 #endif 27 #endif 28 29 #include <functional> 30 #include <memory> 31 #include <ostream> 32 33 #include "android-base/macros.h" 34 35 namespace android { 36 namespace base { 37 38 enum LogSeverity { 39 VERBOSE, 40 DEBUG, 41 INFO, 42 WARNING, 43 ERROR, 44 FATAL, 45 }; 46 47 enum LogId { 48 DEFAULT, 49 MAIN, 50 SYSTEM, 51 }; 52 53 typedef std::function<void(LogId, LogSeverity, const char*, const char*, 54 unsigned int, const char*)> LogFunction; 55 56 extern void StderrLogger(LogId, LogSeverity, const char*, const char*, 57 unsigned int, const char*); 58 59 #ifdef __ANDROID__ 60 // We expose this even though it is the default because a user that wants to 61 // override the default log buffer will have to construct this themselves. 62 class LogdLogger { 63 public: 64 explicit LogdLogger(LogId default_log_id = android::base::MAIN); 65 66 void operator()(LogId, LogSeverity, const char* tag, const char* file, 67 unsigned int line, const char* message); 68 69 private: 70 LogId default_log_id_; 71 }; 72 #endif 73 74 // Configure logging based on ANDROID_LOG_TAGS environment variable. 75 // We need to parse a string that looks like 76 // 77 // *:v jdwp:d dalvikvm:d dalvikvm-gc:i dalvikvmi:i 78 // 79 // The tag (or '*' for the global level) comes first, followed by a colon and a 80 // letter indicating the minimum priority level we're expected to log. This can 81 // be used to reveal or conceal logs with specific tags. 82 extern void InitLogging(char* argv[], LogFunction&& logger); 83 84 // Configures logging using the default logger (logd for the device, stderr for 85 // the host). 86 extern void InitLogging(char* argv[]); 87 88 // Replace the current logger. 89 extern void SetLogger(LogFunction&& logger); 90 91 // Get the minimum severity level for logging. 92 extern LogSeverity GetMinimumLogSeverity(); 93 94 class ErrnoRestorer { 95 public: 96 ErrnoRestorer() 97 : saved_errno_(errno) { 98 } 99 100 ~ErrnoRestorer() { 101 errno = saved_errno_; 102 } 103 104 // Allow this object to be used as part of && operation. 105 operator bool() const { 106 return true; 107 } 108 109 private: 110 const int saved_errno_; 111 112 DISALLOW_COPY_AND_ASSIGN(ErrnoRestorer); 113 }; 114 115 // Logs a message to logcat on Android otherwise to stderr. If the severity is 116 // FATAL it also causes an abort. For example: 117 // 118 // LOG(FATAL) << "We didn't expect to reach here"; 119 #define LOG(severity) LOG_TO(DEFAULT, severity) 120 121 // Logs a message to logcat with the specified log ID on Android otherwise to 122 // stderr. If the severity is FATAL it also causes an abort. 123 // Use an if-else statement instead of just an if statement here. So if there is a 124 // else statement after LOG() macro, it won't bind to the if statement in the macro. 125 // do-while(0) statement doesn't work here. Because we need to support << operator 126 // following the macro, like "LOG(DEBUG) << xxx;". 127 #define LOG_TO(dest, severity) \ 128 UNLIKELY(::android::base::severity >= ::android::base::GetMinimumLogSeverity()) && \ 129 ::android::base::ErrnoRestorer() && \ 130 ::android::base::LogMessage(__FILE__, __LINE__, \ 131 ::android::base::dest, \ 132 ::android::base::severity, -1).stream() 133 134 // A variant of LOG that also logs the current errno value. To be used when 135 // library calls fail. 136 #define PLOG(severity) PLOG_TO(DEFAULT, severity) 137 138 // Behaves like PLOG, but logs to the specified log ID. 139 #define PLOG_TO(dest, severity) \ 140 UNLIKELY(::android::base::severity >= ::android::base::GetMinimumLogSeverity()) && \ 141 ::android::base::ErrnoRestorer() && \ 142 ::android::base::LogMessage(__FILE__, __LINE__, \ 143 ::android::base::dest, \ 144 ::android::base::severity, errno).stream() 145 146 // Marker that code is yet to be implemented. 147 #define UNIMPLEMENTED(level) \ 148 LOG(level) << __PRETTY_FUNCTION__ << " unimplemented " 149 150 // Check whether condition x holds and LOG(FATAL) if not. The value of the 151 // expression x is only evaluated once. Extra logging can be appended using << 152 // after. For example: 153 // 154 // CHECK(false == true) results in a log message of 155 // "Check failed: false == true". 156 #define CHECK(x) \ 157 LIKELY((x)) || \ 158 ::android::base::LogMessage(__FILE__, __LINE__, ::android::base::DEFAULT, \ 159 ::android::base::FATAL, -1).stream() \ 160 << "Check failed: " #x << " " 161 162 // Helper for CHECK_xx(x,y) macros. 163 #define CHECK_OP(LHS, RHS, OP) \ 164 for (auto _values = ::android::base::MakeEagerEvaluator(LHS, RHS); \ 165 UNLIKELY(!(_values.lhs OP _values.rhs)); \ 166 /* empty */) \ 167 ::android::base::LogMessage(__FILE__, __LINE__, ::android::base::DEFAULT, \ 168 ::android::base::FATAL, -1).stream() \ 169 << "Check failed: " << #LHS << " " << #OP << " " << #RHS \ 170 << " (" #LHS "=" << _values.lhs << ", " #RHS "=" << _values.rhs << ") " 171 172 // Check whether a condition holds between x and y, LOG(FATAL) if not. The value 173 // of the expressions x and y is evaluated once. Extra logging can be appended 174 // using << after. For example: 175 // 176 // CHECK_NE(0 == 1, false) results in 177 // "Check failed: false != false (0==1=false, false=false) ". 178 #define CHECK_EQ(x, y) CHECK_OP(x, y, == ) 179 #define CHECK_NE(x, y) CHECK_OP(x, y, != ) 180 #define CHECK_LE(x, y) CHECK_OP(x, y, <= ) 181 #define CHECK_LT(x, y) CHECK_OP(x, y, < ) 182 #define CHECK_GE(x, y) CHECK_OP(x, y, >= ) 183 #define CHECK_GT(x, y) CHECK_OP(x, y, > ) 184 185 // Helper for CHECK_STRxx(s1,s2) macros. 186 #define CHECK_STROP(s1, s2, sense) \ 187 if (LIKELY((strcmp(s1, s2) == 0) == sense)) \ 188 ; \ 189 else \ 190 LOG(FATAL) << "Check failed: " \ 191 << "\"" << s1 << "\"" \ 192 << (sense ? " == " : " != ") << "\"" << s2 << "\"" 193 194 // Check for string (const char*) equality between s1 and s2, LOG(FATAL) if not. 195 #define CHECK_STREQ(s1, s2) CHECK_STROP(s1, s2, true) 196 #define CHECK_STRNE(s1, s2) CHECK_STROP(s1, s2, false) 197 198 // Perform the pthread function call(args), LOG(FATAL) on error. 199 #define CHECK_PTHREAD_CALL(call, args, what) \ 200 do { \ 201 int rc = call args; \ 202 if (rc != 0) { \ 203 errno = rc; \ 204 PLOG(FATAL) << #call << " failed for " << what; \ 205 } \ 206 } while (false) 207 208 // CHECK that can be used in a constexpr function. For example: 209 // 210 // constexpr int half(int n) { 211 // return 212 // DCHECK_CONSTEXPR(n >= 0, , 0) 213 // CHECK_CONSTEXPR((n & 1) == 0), 214 // << "Extra debugging output: n = " << n, 0) 215 // n / 2; 216 // } 217 #define CHECK_CONSTEXPR(x, out, dummy) \ 218 (UNLIKELY(!(x))) \ 219 ? (LOG(FATAL) << "Check failed: " << #x out, dummy) \ 220 : 221 222 // DCHECKs are debug variants of CHECKs only enabled in debug builds. Generally 223 // CHECK should be used unless profiling identifies a CHECK as being in 224 // performance critical code. 225 #if defined(NDEBUG) 226 static constexpr bool kEnableDChecks = false; 227 #else 228 static constexpr bool kEnableDChecks = true; 229 #endif 230 231 #define DCHECK(x) \ 232 if (::android::base::kEnableDChecks) CHECK(x) 233 #define DCHECK_EQ(x, y) \ 234 if (::android::base::kEnableDChecks) CHECK_EQ(x, y) 235 #define DCHECK_NE(x, y) \ 236 if (::android::base::kEnableDChecks) CHECK_NE(x, y) 237 #define DCHECK_LE(x, y) \ 238 if (::android::base::kEnableDChecks) CHECK_LE(x, y) 239 #define DCHECK_LT(x, y) \ 240 if (::android::base::kEnableDChecks) CHECK_LT(x, y) 241 #define DCHECK_GE(x, y) \ 242 if (::android::base::kEnableDChecks) CHECK_GE(x, y) 243 #define DCHECK_GT(x, y) \ 244 if (::android::base::kEnableDChecks) CHECK_GT(x, y) 245 #define DCHECK_STREQ(s1, s2) \ 246 if (::android::base::kEnableDChecks) CHECK_STREQ(s1, s2) 247 #define DCHECK_STRNE(s1, s2) \ 248 if (::android::base::kEnableDChecks) CHECK_STRNE(s1, s2) 249 #if defined(NDEBUG) 250 #define DCHECK_CONSTEXPR(x, out, dummy) 251 #else 252 #define DCHECK_CONSTEXPR(x, out, dummy) CHECK_CONSTEXPR(x, out, dummy) 253 #endif 254 255 // Temporary class created to evaluate the LHS and RHS, used with 256 // MakeEagerEvaluator to infer the types of LHS and RHS. 257 template <typename LHS, typename RHS> 258 struct EagerEvaluator { 259 EagerEvaluator(LHS l, RHS r) : lhs(l), rhs(r) { 260 } 261 LHS lhs; 262 RHS rhs; 263 }; 264 265 // Helper function for CHECK_xx. 266 template <typename LHS, typename RHS> 267 static inline EagerEvaluator<LHS, RHS> MakeEagerEvaluator(LHS lhs, RHS rhs) { 268 return EagerEvaluator<LHS, RHS>(lhs, rhs); 269 } 270 271 // Explicitly instantiate EagerEvalue for pointers so that char*s aren't treated 272 // as strings. To compare strings use CHECK_STREQ and CHECK_STRNE. We rely on 273 // signed/unsigned warnings to protect you against combinations not explicitly 274 // listed below. 275 #define EAGER_PTR_EVALUATOR(T1, T2) \ 276 template <> \ 277 struct EagerEvaluator<T1, T2> { \ 278 EagerEvaluator(T1 l, T2 r) \ 279 : lhs(reinterpret_cast<const void*>(l)), \ 280 rhs(reinterpret_cast<const void*>(r)) { \ 281 } \ 282 const void* lhs; \ 283 const void* rhs; \ 284 } 285 EAGER_PTR_EVALUATOR(const char*, const char*); 286 EAGER_PTR_EVALUATOR(const char*, char*); 287 EAGER_PTR_EVALUATOR(char*, const char*); 288 EAGER_PTR_EVALUATOR(char*, char*); 289 EAGER_PTR_EVALUATOR(const unsigned char*, const unsigned char*); 290 EAGER_PTR_EVALUATOR(const unsigned char*, unsigned char*); 291 EAGER_PTR_EVALUATOR(unsigned char*, const unsigned char*); 292 EAGER_PTR_EVALUATOR(unsigned char*, unsigned char*); 293 EAGER_PTR_EVALUATOR(const signed char*, const signed char*); 294 EAGER_PTR_EVALUATOR(const signed char*, signed char*); 295 EAGER_PTR_EVALUATOR(signed char*, const signed char*); 296 EAGER_PTR_EVALUATOR(signed char*, signed char*); 297 298 // Data for the log message, not stored in LogMessage to avoid increasing the 299 // stack size. 300 class LogMessageData; 301 302 // A LogMessage is a temporarily scoped object used by LOG and the unlikely part 303 // of a CHECK. The destructor will abort if the severity is FATAL. 304 class LogMessage { 305 public: 306 LogMessage(const char* file, unsigned int line, LogId id, 307 LogSeverity severity, int error); 308 309 ~LogMessage(); 310 311 // Returns the stream associated with the message, the LogMessage performs 312 // output when it goes out of scope. 313 std::ostream& stream(); 314 315 // The routine that performs the actual logging. 316 static void LogLine(const char* file, unsigned int line, LogId id, 317 LogSeverity severity, const char* msg); 318 319 private: 320 const std::unique_ptr<LogMessageData> data_; 321 322 DISALLOW_COPY_AND_ASSIGN(LogMessage); 323 }; 324 325 // Allows to temporarily change the minimum severity level for logging. 326 class ScopedLogSeverity { 327 public: 328 explicit ScopedLogSeverity(LogSeverity level); 329 ~ScopedLogSeverity(); 330 331 private: 332 LogSeverity old_; 333 }; 334 335 } // namespace base 336 } // namespace android 337 338 #endif // ANDROID_BASE_LOGGING_H 339