====== 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 [[http://jk-wiki.kreick.de/doku.php?id=edv:prg:c:tipp:vordefinierte_praeprozessor-direktiven#string-literal-operator|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 ****-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 -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 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 --- //[[feedback.jk-wiki@kreick.de|: Jürgen Kreick]]// EOF