Benutzer-Werkzeuge

Webseiten-Werkzeuge


edv:prg:c:example:debug-makros

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

edv/prg/c/example/debug-makros.txt · Zuletzt geändert: 2020/01/11 01:23 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki