Inhaltsverzeichnis
Debug-Makros
Einige nützliche Beispiele, die sich beim "Debuggen" als hilfreich erwiesen haben.
DEBUG_MAKROS_TRACE_AKTIV aktiviert DEBUG-Makros für die zusätzlichen Trace-Ausgaben auf stderr:
#ifdef DEBUG_MAKROS_TRACE_AKTIV #define DEBUG_FUNC_ENTRY() fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: --> ENTRY\n", __FILE__, __func__, __LINE__) #define DEBUG_FUNC_RC_VOID() fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: <-- EXIT; RC: (void)\n", __FILE__, __func__, __LINE__) #define DEBUG_FUNC_RC_INT(rc_name,rc_int) fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: <-- EXIT; RC: [%s]=[%d]\n", __FILE__, __func__, __LINE__, rc_name, rc_int) #define DEBUG_FUNC_RC_STR(rc_name,rc_str) fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: <-- EXIT; RC: [%s]=[%s]\n", __FILE__, __func__, __LINE__, rc_name, rc_str) #define DEBUG_VAR_STR(var_name,var_str) fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: Var: [%s]=[%s]\n", __FILE__, __func__, __LINE__, var_name, var_str ? var_str : "NULL") #define DEBUG_VAR_INT(var_name,var_int) fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: Var: [%s]=[%d]\n", __FILE__, __func__, __LINE__, var_name, var_int) #define DEBUG_INFO(info) fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: INF: [%s]\n", __FILE__, __func__, __LINE__, info) #define DEBUG_ERROR(info) fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: ERR: [%s]\n", __FILE__, __func__, __LINE__, info) #define DEBUG_MARK() fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: ---------- MARK ----------\n", __FILE__, __func__, __LINE__) #else #define DEBUG_FUNC_ENTRY() #define DEBUG_FUNC_RC_VOID() #define DEBUG_FUNC_RC_INT(rc_name,rc_int) #define DEBUG_FUNC_RC_STR(rc_name,rc_str) #define DEBUG_VAR_STR(var_name,var_str) #define DEBUG_VAR_INT(var_name,var_int) #define DEBUG_INFO(info) #define DEBUG_ERROR(info) #define DEBUG_MARK() #endif
Das gleiche, aber etwas fortgeschrittener (mit Verwendung von String-Literal-Operator) kann wie folgt definiert werden:
#ifdef DEBUG_MAKROS_TRACE_AKTIV #define DEBUG_FUNC_ENTRY() fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: --> ENTRY\n", __FILE__, __func__, __LINE__) #define DEBUG_FUNC_RC_VOID() fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: <-- EXIT; RC: (void)\n", __FILE__, __func__, __LINE__) #define DEBUG_FUNC_RC_INT(rc_int) fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: <-- EXIT; RC: [" #rc_int "]=[%d]\n", __FILE__, __func__, __LINE__, rc_int) #define DEBUG_FUNC_RC_STR(rc_str) fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: <-- EXIT; RC: [" #rc_str "]=[%s]\n", __FILE__, __func__, __LINE__, rc_str) #define DEBUG_VAR_STR(var_str) fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: Var: [" #var_str "]=[%s]\n", __FILE__, __func__, __LINE__, var_str ? var_str : "NULL") #define DEBUG_VAR_INT(var_int) fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: Var: [" #var_int "]=[%d]\n", __FILE__, __func__, __LINE__, var_int) #define DEBUG_INFO(info) fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: INF: [%s]\n", __FILE__, __func__, __LINE__, info) #define DEBUG_ERROR(info) fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: ERR: [%s]\n", __FILE__, __func__, __LINE__, info) #define DEBUG_MARK() fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: ---------- MARK ----------\n", __FILE__, __func__, __LINE__) #else #define DEBUG_FUNC_ENTRY() #define DEBUG_FUNC_RC_VOID() #define DEBUG_FUNC_RC_INT(rc_int) #define DEBUG_FUNC_RC_STR(rc_str) #define DEBUG_VAR_STR(var_str) #define DEBUG_VAR_INT(var_int) #define DEBUG_INFO(info) #define DEBUG_ERROR(info) #define DEBUG_MARK() #endif
DEBUG_MAKROS_STEP_AKTIV aktiviert DEBUG-Makros für die Unterbrechungen in Ablauf. Fortsetzen mit der <Enter>-Taste.
#ifdef DEBUG_MAKROS_STEP_AKTIV #define DEBUG_PAUSE_PRESS_ENTER() { char getsStr [16]; fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d]: Weiter mit <ENTER>-Taste ", __FILE__, __func__, __LINE__); gets(getsStr); fprintf(stderr, "----------------------------------------------------------------------\n"); } #define DEBUG_FORCE_EXIT(rc) { fprintf(stderr, "DEBUG: FILE=[%s] func=[%s] LINE=[%d] DEBUG_FORCE_EXIT: Das Programm wird zwangsweise beendet, EXIT-Code=[%d].\n\n", __FILE__, __func__, __LINE__, rc); exit(rc); } #else #define DEBUG_PAUSE_PRESS_ENTER() #define DEBUG_FORCE_EXIT(rc) #endif
Vordefinierte Debug-Makros
NDEBUG
If NDEBUG is defined as a macro name at the point in the source code where <assert.h> is included, then assert does nothing:
https://en.cppreference.com/w/c/error/assert
_DEBUG
Dieses Makro ist MS- bzw. VisualStudio-spezifisch.
_DEBUG is defined as 1 when the /LDd, /MDd, or /MTd compiler option is set. Otherwise, undefined.
https://msdn.microsoft.com/en-us/library/b0084kay.aspx
Stand: 31.07.2018 — : Jürgen Kreick
EOF