u_debug.h revision dd51365acdd515577ee76850ceda01347ceb27c0
1a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca/************************************************************************** 2a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * 3a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * All Rights Reserved. 5a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * 6a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 7a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * copy of this software and associated documentation files (the 8a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * "Software"), to deal in the Software without restriction, including 9a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish, 10a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to 11a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to 12a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * the following conditions: 13a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * 14a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * The above copyright notice and this permission notice (including the 15a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * next paragraph) shall be included in all copies or substantial portions 16a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * of the Software. 17a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * 18a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * 26a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca **************************************************************************/ 27a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca 28a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca/** 29a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * @file 30a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * Cross-platform debugging helpers. 31a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * 32a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * For now it just has assert and printf replacements, but it might be extended 33a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * with stack trace reports and more advanced logging in the near future. 34a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * 35a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * @author Jose Fonseca <jrfonseca@tungstengraphics.com> 36a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca */ 37a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca 38a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifndef P_DEBUG_H_ 39a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#define P_DEBUG_H_ 40a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca 41af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca 42af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca#include <stdarg.h> 43af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca 4445c59895113f997e5f2b7e346f95e46099fa3566José Fonseca#include "p_compiler.h" 4545c59895113f997e5f2b7e346f95e46099fa3566José Fonseca 46af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca 47a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef __cplusplus 48a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonsecaextern "C" { 49a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif 50a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca 51a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca 52a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef DBG 53a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifndef DEBUG 54a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#define DEBUG 1 55a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif 56a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#else 57a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifndef NDEBUG 58a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#define NDEBUG 1 59a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif 60a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif 61a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca 62a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca 63dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecavoid _debug_vprintf(const char *format, va_list ap); 64dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 65dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 66dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecastatic void INLINE 67dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca_debug_printf(const char *format, ...) 68dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca{ 69dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca va_list ap; 70dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca va_start(ap, format); 71dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca _debug_vprintf(format, ap); 72dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca va_end(ap); 73dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca} 74dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 75dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 76fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca/** 77fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * Print debug messages. 78fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * 79fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * The actual channel used to output debug message is platform specific. To 80fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * avoid misformating or truncation, follow these rules of thumb: 81fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * - output whole lines 82fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * - avoid outputing large strings (512 bytes is the current maximum length 83fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * that is guaranteed to be printed in all platforms) 84fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca */ 85dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecastatic void INLINE 86dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecadebug_printf(const char *format, ...) 87dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca{ 88dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG 89dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca va_list ap; 90dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca va_start(ap, format); 91dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca _debug_vprintf(format, ap); 92dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca va_end(ap); 93dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif 94dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca} 95dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 96dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 97dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG 98dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_vprintf(_format, _ap) _debug_vprintf(_format, _ap) 99dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else 100dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_vprintf(_format, _ap) ((void)0) 101dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif 102af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca 103a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwell 104dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/** 105dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Dump a blob in hex to the same place that debug_printf sends its 106dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * messages. 107a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwell */ 108dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG 109a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwellvoid debug_print_blob( const char *name, 110a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwell const void *blob, 111a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwell unsigned size ); 112dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else 113dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_print_blob(_name, _blob, _size) ((void)0) 114dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif 115dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 116dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 117dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecavoid _debug_break(void); 118dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 119a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwell 120fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca/** 121dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Hard-coded breakpoint. 122fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca */ 123dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG 124dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#if (defined(__i386__) || defined(__386__)) && defined(__GNUC__) 125dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_break() __asm("int3") 126dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#elif (defined(__i386__) || defined(__386__)) && defined(__MSC__) 127dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_break() _asm {int 3} 128dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else 129dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_break() _debug_break() 130dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif 131dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else /* !DEBUG */ 132dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_break() ((void)0) 133dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif /* !DEBUG */ 134af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca 135a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca 136dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecavoid _debug_assert_fail(const char *expr, 137dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca const char *file, 138dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca unsigned line, 139dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca const char *function); 140af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca 141dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 142dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/** 143dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Assert macro 144dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * 145dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Do not expect that the assert call terminates -- errors must be handled 146dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * regardless of assert behavior. 147dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */ 148a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef DEBUG 149dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_assert(expr) ((expr) ? (void)0 : _debug_assert_fail(#expr, __FILE__, __LINE__, __FUNCTION__)) 150a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#else 151a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#define debug_assert(expr) ((void)0) 152a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif 153a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca 154a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca 155dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/** Override standard assert macro */ 156a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef assert 157a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#undef assert 158a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif 159a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#define assert(expr) debug_assert(expr) 160a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca 161a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca 162dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/** 163dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Output the current function name. 164dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */ 165dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG 166dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_checkpoint() \ 167dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca _debug_printf("%s\n", __FUNCTION__) 168dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else 169dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_checkpoint() \ 170dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca ((void)0) 171dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif 172dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 173dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 174dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/** 175dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Output the full source code position. 176dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */ 177dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG 178dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_checkpoint_full() \ 179dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca debug_printf("%s:%u:%s", __FILE__, __LINE__, __FUNCTION__) 180dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else 181dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_checkpoint_full() \ 182dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca ((void)0) 183dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif 184dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 185dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 186dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/** 187dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Output a warning message. Muted on release version. 188dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */ 189d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#ifdef DEBUG 190d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#define debug_warning(__msg) \ 191dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca _debug_printf("%s:%u:%s: warning: %s\n", __FILE__, __LINE__, __FUNCTION__, (__msg)) 192d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#else 193d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#define debug_warning(__msg) \ 194d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca ((void)0) 195d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#endif 196d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca 197d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca 198e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca/** 199dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Output an error message. Not muted on release version. 200dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */ 201dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG 202dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_error(__msg) \ 203dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca _debug_printf("%s:%u:%s: error: %s\n", __FILE__, __LINE__, __FUNCTION__, (__msg)) 204dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else 205dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_error(__msg) \ 206dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca _debug_printf("error: %s\n", __msg)) 207dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif 208dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 209dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca 210dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/** 211e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Used by debug_dump_enum and debug_dump_flags to describe symbols. 212e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca */ 213e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecastruct debug_named_value 214e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca{ 215e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca const char *name; 216e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca unsigned long value; 217e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca}; 218e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca 219e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca 220e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca/** 221e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Some C pre-processor magic to simplify creating named values. 222e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * 223e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Example: 224e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * @code 225e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * static const debug_named_value my_names[] = { 226e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * DEBUG_NAMED_VALUE(MY_ENUM_VALUE_X), 227e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Y), 228e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Z), 229e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * DEBUG_NAMED_VALUE_END 230e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * }; 231e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * 232e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * ... 233e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * debug_printf("%s = %s\n", 234e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * name, 235e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * debug_dump_enum(my_names, my_value)); 236e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * ... 237e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * @endcode 238e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca */ 239e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca#define DEBUG_NAMED_VALUE(__symbol) {#__symbol, (unsigned long)__symbol} 240e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca#define DEBUG_NAMED_VALUE_END {NULL, 0} 241e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca 242e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca 243e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca/** 244e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Convert a enum value to a string. 245e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca */ 246e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecaconst char * 247e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecadebug_dump_enum(const struct debug_named_value *names, 248e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca unsigned long value); 249e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca 250e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca 251e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca/** 252e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Convert binary flags value to a string. 253e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca */ 254e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecaconst char * 255e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecadebug_dump_flags(const struct debug_named_value *names, 256e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca unsigned long value); 257e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca 258e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca 259732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecavoid * 260732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecadebug_malloc(const char *file, unsigned line, const char *function, 261732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca size_t size); 262732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca 263732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecavoid 264732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecadebug_free(const char *file, unsigned line, const char *function, 265732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca void *ptr); 266732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca 267732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecavoid * 268732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecadebug_calloc(const char *file, unsigned line, const char *function, 269732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca size_t count, size_t size ); 270732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca 271732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecavoid * 272732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecadebug_realloc(const char *file, unsigned line, const char *function, 273732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca void *old_ptr, size_t old_size, size_t new_size ); 274732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca 275732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecavoid 276732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecadebug_memory_reset(void); 277732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca 278732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecavoid 279732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecadebug_memory_report(void); 280732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca 281732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca 282a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef __cplusplus 283a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca} 284a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif 285a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca 286a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif /* P_DEBUG_H_ */ 287