From 4241e27ee1c6739b5442f157bf167f050d546582 Mon Sep 17 00:00:00 2001 From: David Sterba Date: Fri, 19 Aug 2016 16:06:41 +0200 Subject: [PATCH] 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 --- Makefile.in | 23 ++++++++++++++++++++ utils.h | 61 +++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/Makefile.in b/Makefile.in index ac6b353b..9e0cb4c4 100644 --- a/Makefile.in +++ b/Makefile.in @@ -12,6 +12,11 @@ # V=1 verbose, print command lines (default: quiet) # C=1 run checker before compilation (default checker: sparse) # 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) # DEBUG_CFLAGS additional compiler flags for debugging build # EXTRA_CFLAGS additional compiler flags @@ -121,6 +126,24 @@ ifeq ("$(origin D)", "command line") DEBUG_CFLAGS_INTERNAL = $(DEBUG_CFLAGS_DEFAULT) $(DEBUG_CFLAGS) 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) # build all by default diff --git a/utils.h b/utils.h index 58121ced..da23bfcc 100644 --- a/utils.h +++ b/utils.h @@ -311,8 +311,61 @@ void clean_args_no_options_relaxed(int argc, char *argv[], const char * const *usagestr); 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))) -static inline void warning(const char *fmt, ...) +static inline void __warning(const char *fmt, ...) { va_list args; @@ -324,7 +377,7 @@ static inline void warning(const char *fmt, ...) } __attribute__ ((format (printf, 1, 2))) -static inline void error(const char *fmt, ...) +static inline void __error(const char *fmt, ...) { va_list args; @@ -336,7 +389,7 @@ static inline void error(const char *fmt, ...) } __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; @@ -353,7 +406,7 @@ static inline int warning_on(int condition, const char *fmt, ...) } __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;