btrfs-progs: build: add more debugging features

Add options to show file and line or stack trace for error/warning
messages that use the common helpers. Possible to let any error stop
execution for ease of analysis and debugging.

Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
David Sterba 2016-08-19 16:06:41 +02:00
parent 49184a737b
commit 4241e27ee1
2 changed files with 80 additions and 4 deletions

View File

@ -12,6 +12,11 @@
# V=1 verbose, print command lines (default: quiet) # V=1 verbose, print command lines (default: quiet)
# C=1 run checker before compilation (default checker: sparse) # C=1 run checker before compilation (default checker: sparse)
# D=1 debugging build, turn off optimizations # D=1 debugging build, turn off optimizations
# D=dflags dtto, turn on additional debugging features:
# verbose - print file:line along with error/warning messages
# trace - print trace before the error/warning messages
# abort - call abort() on first error (dumps core)
# all - shortcut for all of the above
# W=123 build with warnings (default: off) # W=123 build with warnings (default: off)
# DEBUG_CFLAGS additional compiler flags for debugging build # DEBUG_CFLAGS additional compiler flags for debugging build
# EXTRA_CFLAGS additional compiler flags # EXTRA_CFLAGS additional compiler flags
@ -121,6 +126,24 @@ ifeq ("$(origin D)", "command line")
DEBUG_CFLAGS_INTERNAL = $(DEBUG_CFLAGS_DEFAULT) $(DEBUG_CFLAGS) DEBUG_CFLAGS_INTERNAL = $(DEBUG_CFLAGS_DEFAULT) $(DEBUG_CFLAGS)
endif endif
ifneq (,$(findstring verbose,$(D)))
DEBUG_CFLAGS_INTERNAL += -DDEBUG_VERBOSE_ERROR=1
endif
ifneq (,$(findstring trace,$(D)))
DEBUG_CFLAGS_INTERNAL += -DDEBUG_TRACE_ON_ERROR=1
endif
ifneq (,$(findstring abort,$(D)))
DEBUG_CFLAGS_INTERNAL += -DDEBUG_ABORT_ON_ERROR=1
endif
ifneq (,$(findstring all,$(D)))
DEBUG_CFLAGS_INTERNAL += -DDEBUG_VERBOSE_ERROR=1
DEBUG_CFLAGS_INTERNAL += -DDEBUG_TRACE_ON_ERROR=1
DEBUG_CFLAGS_INTERNAL += -DDEBUG_ABORT_ON_ERROR=1
endif
MAKEOPTS = --no-print-directory Q=$(Q) MAKEOPTS = --no-print-directory Q=$(Q)
# build all by default # build all by default

61
utils.h
View File

@ -311,8 +311,61 @@ void clean_args_no_options_relaxed(int argc, char *argv[],
const char * const *usagestr); const char * const *usagestr);
int string_is_numerical(const char *str); int string_is_numerical(const char *str);
#if DEBUG_VERBOSE_ERROR
#define PRINT_VERBOSE_ERROR fprintf(stderr, "%s:%d:", __FILE__, __LINE__)
#else
#define PRINT_VERBOSE_ERROR
#endif
#if DEBUG_TRACE_ON_ERROR
#define PRINT_TRACE_ON_ERROR print_trace()
#else
#define PRINT_TRACE_ON_ERROR
#endif
#if DEBUG_ABORT_ON_ERROR
#define DO_ABORT_ON_ERROR abort()
#else
#define DO_ABORT_ON_ERROR
#endif
#define error(fmt, ...) \
do { \
PRINT_TRACE_ON_ERROR; \
PRINT_VERBOSE_ERROR; \
__error((fmt), ##__VA_ARGS__); \
DO_ABORT_ON_ERROR; \
} while (0)
#define error_on(cond, fmt, ...) \
do { \
if ((cond)) \
PRINT_TRACE_ON_ERROR; \
if ((cond)) \
PRINT_VERBOSE_ERROR; \
__error_on((cond), (fmt), ##__VA_ARGS__); \
if ((cond)) \
DO_ABORT_ON_ERROR; \
} while (0)
#define warning(fmt, ...) \
do { \
PRINT_TRACE_ON_ERROR; \
PRINT_VERBOSE_ERROR; \
__warning((fmt), ##__VA_ARGS__); \
} while (0)
#define warning_on(cond, fmt, ...) \
do { \
if ((cond)) \
PRINT_TRACE_ON_ERROR; \
if ((cond)) \
PRINT_VERBOSE_ERROR; \
__warning_on((cond), (fmt), ##__VA_ARGS__); \
} while (0)
__attribute__ ((format (printf, 1, 2))) __attribute__ ((format (printf, 1, 2)))
static inline void warning(const char *fmt, ...) static inline void __warning(const char *fmt, ...)
{ {
va_list args; va_list args;
@ -324,7 +377,7 @@ static inline void warning(const char *fmt, ...)
} }
__attribute__ ((format (printf, 1, 2))) __attribute__ ((format (printf, 1, 2)))
static inline void error(const char *fmt, ...) static inline void __error(const char *fmt, ...)
{ {
va_list args; va_list args;
@ -336,7 +389,7 @@ static inline void error(const char *fmt, ...)
} }
__attribute__ ((format (printf, 2, 3))) __attribute__ ((format (printf, 2, 3)))
static inline int warning_on(int condition, const char *fmt, ...) static inline int __warning_on(int condition, const char *fmt, ...)
{ {
va_list args; va_list args;
@ -353,7 +406,7 @@ static inline int warning_on(int condition, const char *fmt, ...)
} }
__attribute__ ((format (printf, 2, 3))) __attribute__ ((format (printf, 2, 3)))
static inline int error_on(int condition, const char *fmt, ...) static inline int __error_on(int condition, const char *fmt, ...)
{ {
va_list args; va_list args;