1 /* 2 * Copyright 2003-2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Copyright 200?, Axel Dörfler, axeld@pinc-software.de. 4 * Distributed under the terms of the MIT License. 5 */ 6 #ifndef DEBUG_SUPPORT_H 7 #define DEBUG_SUPPORT_H 8 9 10 #include <string.h> 11 12 13 #if !USER 14 # include <KernelExport.h> 15 # include <OS.h> 16 #endif 17 #include <SupportDefs.h> 18 19 20 // define all macros we work with -- undefined macros are set to defaults 21 #ifndef USER 22 # define USER 0 23 #endif 24 #ifndef DEBUG 25 # define DEBUG 0 26 #endif 27 #if !DEBUG 28 # undef DEBUG_PRINT 29 # define DEBUG_PRINT 0 30 #endif 31 #ifndef DEBUG_PRINT 32 # define DEBUG_PRINT 0 33 #endif 34 #ifndef DEBUG_APP 35 # define DEBUG_APP "unknown" 36 #endif 37 #ifndef DEBUG_PRINT_FILE 38 # define DEBUG_PRINT_FILE "/var/log/" DEBUG_APP ".log" 39 #endif 40 41 42 // define the debug output function 43 #if USER 44 # include <stdio.h> 45 # if DEBUG_PRINT 46 # define __out dbg_printf 47 # define __outv dbg_vprintf 48 # else 49 # define __out printf 50 # define __outv vprintf 51 # endif 52 #else 53 # include <KernelExport.h> 54 # include <null.h> 55 # if DEBUG_PRINT 56 # define __out dbg_printf 57 # define __outv dbg_vprintf 58 # else 59 # define __out dprintf 60 # define __outv dvprintf 61 # endif 62 #endif 63 64 65 // define the PANIC() macro 66 #ifndef PANIC 67 # if USER 68 # define PANIC(str) debugger(str) 69 # else 70 # define PANIC(str) panic(str) 71 # endif 72 #endif 73 74 75 // functions exported by this module 76 status_t init_debugging(); 77 status_t exit_debugging(); 78 void dbg_printf_begin(); 79 void dbg_printf_end(); 80 #if DEBUG_PRINT 81 void dbg_vprintf(const char* format, va_list args); 82 void dbg_printf(const char* format,...); 83 #else dbg_vprintf(const char *,va_list)84 static inline void dbg_vprintf(const char*, va_list) {} dbg_printf(const char *,...)85 static inline void dbg_printf(const char*,...) {} 86 #endif 87 88 89 // Short overview of the debug output macros: 90 // PRINT() 91 // general messages that shouldn't appear in a release build 92 // FATAL() 93 // fatal messages, when something has really gone wrong 94 // ERROR() 95 // non-fatal error messages 96 // WARN() 97 // warning messages 98 // INFORM() 99 // general information, as disk size, etc. 100 // REPORT_ERROR(status_t) 101 // prints out error information 102 // RETURN_ERROR(status_t) 103 // calls REPORT_ERROR() and return the value 104 // D() 105 // the statements in D() are only included if DEBUG is defined 106 107 108 #define DEBUG_THREAD find_thread(NULL) 109 #define DEBUG_CONTEXT(x) \ 110 { \ 111 dbg_printf_begin(); \ 112 __out(DEBUG_APP ": [%" B_PRIdBIGTIME ": %5" B_PRId32 "] ", \ 113 system_time(), DEBUG_THREAD); \ 114 x; \ 115 dbg_printf_end(); \ 116 } 117 #define DEBUG_CONTEXT_FUNCTION(prefix, x) \ 118 { \ 119 dbg_printf_begin(); \ 120 __out(DEBUG_APP ": [%" B_PRIdBIGTIME ": %5" B_PRId32 "] %s" prefix, \ 121 system_time(), DEBUG_THREAD, __PRETTY_FUNCTION__); \ 122 x; \ 123 dbg_printf_end(); \ 124 } 125 #define DEBUG_CONTEXT_LINE(x) \ 126 { \ 127 dbg_printf_begin(); \ 128 __out(DEBUG_APP ": [%" B_PRIdBIGTIME ": %5" B_PRId32 "] %s:%d: ", \ 129 system_time(), DEBUG_THREAD, __PRETTY_FUNCTION__, __LINE__); \ 130 x; \ 131 dbg_printf_end(); \ 132 } 133 134 #define TPRINT(x...) DEBUG_CONTEXT( __out(x) ) 135 #define TPRINTV(format, args) DEBUG_CONTEXT( __outv(format, args) ) 136 #define TREPORT_ERROR(status) \ 137 DEBUG_CONTEXT_LINE( __out("%s\n", strerror(status)) ) 138 #define TRETURN_ERROR(err) \ 139 { \ 140 status_t _status = err; \ 141 if (_status < B_OK) \ 142 TREPORT_ERROR(_status); \ 143 return _status; \ 144 } 145 #define TSET_ERROR(var, err) \ 146 { \ 147 status_t _status = err; \ 148 if (_status < B_OK) \ 149 TREPORT_ERROR(_status); \ 150 var = _status; \ 151 } 152 #define TFUNCTION(x...) DEBUG_CONTEXT_FUNCTION( ": ", __out(x) ) 153 #define TFUNCTION_START() DEBUG_CONTEXT_FUNCTION( "\n", ) 154 #define TFUNCTION_END() DEBUG_CONTEXT_FUNCTION( " done\n", ) 155 156 #if DEBUG 157 #define PRINT(x...) TPRINT(x) 158 #define REPORT_ERROR(status) TREPORT_ERROR(status) 159 #define RETURN_ERROR(err) TRETURN_ERROR(err) 160 #define SET_ERROR(var, err) TSET_ERROR(var, err) 161 #define FUNCTION(x...) TFUNCTION(x) 162 #define FUNCTION_START() TFUNCTION_START() 163 #define FUNCTION_END() TFUNCTION_END() 164 #define DARG(x) x 165 #define D(x) {x;}; 166 #else 167 #define PRINT(x...) ; 168 #define REPORT_ERROR(status) ; 169 #define RETURN_ERROR(status) return status; 170 #define SET_ERROR(var, err) var = err; 171 #define FUNCTION(x...) ; 172 #define FUNCTION_START() ; 173 #define FUNCTION_END() ; 174 #define DARG(x) 175 #define D(x) ; 176 #endif 177 178 #define FATAL(x...) TPRINT(x) 179 #define ERROR(x...) TPRINT(x) 180 #define ERRORV(format, args) TPRINTV(format, args) 181 #define WARN(x...) TPRINT(x) 182 #define INFORM(x...) TPRINT(x) 183 184 #ifndef TOUCH 185 #define TOUCH(var) (void)var 186 #endif 187 188 189 #endif // DEBUG_SUPPORT_H 190