====== 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