diff --git a/programs/Makefile b/programs/Makefile index 8faa5111b..ac17caee8 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -134,11 +134,14 @@ else LZ4_MSG := $(NO_LZ4_MSG) endif -# enable backtrace symbol names for Linux/Darwin -ALL_SYMBOLS := 0 +# explicit backtrace enable/disable for Linux & Darwin +ifeq ($(BACKTRACE), 0) +DEBUGFLAGS += -DBACKTRACE_ENABLE=0 +endif ifeq (,$(filter Windows%, $(OS))) -ifeq ($(ALL_SYMBOLS), 1) -DEBUGFLAGS_LD+=-rdynamic +ifeq ($(BACKTRACE), 1) +DEBUGFLAGS += -DBACKTRACE_ENABLE=1 +DEBUGFLAGS_LD += -rdynamic endif endif @@ -168,12 +171,12 @@ endif $(CC) $(FLAGS) $^ $(RES_FILE) -o $@$(EXT) $(LDFLAGS) .PHONY: zstd-release -zstd-release: DEBUGFLAGS := +zstd-release: DEBUGFLAGS := -DBACKTRACE_ENABLE=0 zstd-release: DEBUGFLAGS_LD := zstd-release: zstd zstd32 : CPPFLAGS += $(THREAD_CPP) -zstd32 : LDFLAGS += $(THREAD_LD) +zstd32 : LDFLAGS += $(THREAD_LD) zstd32 : CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT) zstd32 : $(ZSTDLIB_FILES) zstdcli.c fileio.c bench.c datagen.c dibio.c ifneq (,$(filter Windows%,$(OS))) @@ -185,17 +188,17 @@ zstd-nolegacy : $(ZSTD_FILES) $(ZDICT_FILES) zstdcli.o fileio.c bench.o datagen. $(CC) $(FLAGS) $^ -o $@$(EXT) $(LDFLAGS) zstd-nomt : THREAD_CPP := -zstd-nomt : THREAD_LD := +zstd-nomt : THREAD_LD := zstd-nomt : THREAD_MSG := - multi-threading disabled zstd-nomt : zstd zstd-nogz : ZLIBCPP := -zstd-nogz : ZLIBLD := +zstd-nogz : ZLIBLD := zstd-nogz : ZLIB_MSG := - gzip support is disabled zstd-nogz : zstd zstd-noxz : LZMACPP := -zstd-noxz : LZMALD := +zstd-noxz : LZMALD := zstd-noxz : LZMA_MSG := - xz/lzma support is disabled zstd-noxz : zstd diff --git a/programs/README.md b/programs/README.md index 804cb8b0a..ca9056eaa 100644 --- a/programs/README.md +++ b/programs/README.md @@ -61,12 +61,12 @@ There are however other Makefile targets that create different variations of CLI In which case, linking stage will fail if `lz4` library cannot be found. This is useful to prevent silent feature disabling. -- __ALL_SYMBOLS__ : `zstd` can display a stack backtrace if the execution +- __BACKTRACE__ : `zstd` can display a stack backtrace when execution generates a runtime exception. By default, this feature may be degraded/disabled on some platforms unless additional compiler directives are - applied. When triaging a runtime issue, enabling this feature can provided + applied. When triaging a runtime issue, enabling this feature can provide more context to determine the location of the fault. - Example : `make zstd ALL_SYMBOLS=1` + Example : `make zstd BACKTRACE=1` #### Aggregation of parameters diff --git a/programs/fileio.c b/programs/fileio.c index 1a73a75e4..7cbaab7da 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -20,12 +20,6 @@ # define _POSIX_SOURCE 1 /* disable %llu warnings with MinGW on Windows */ #endif -#if !defined(BACKTRACES_ENABLE) && \ - (defined(__GLIBC__) || (defined(__APPLE__) && defined(__MACH__)) ) -# define BACKTRACES_ENABLE 1 -#endif - - /*-************************************* * Includes ***************************************/ @@ -37,9 +31,6 @@ #include #include /* errno */ #include -#ifdef BACKTRACES_ENABLE -# include /* backtrace, backtrace_symbols */ -#endif #if defined (_MSC_VER) # include @@ -167,7 +158,30 @@ static void clearHandler(void) /*-********************************************************* * Termination signal trapping (Print debug stack trace) ***********************************************************/ -#ifdef BACKTRACES_ENABLE +#if defined(__has_feature) && !defined(BACKTRACE_ENABLE) /* Clang compiler */ +# if (__has_feature(address_sanitizer)) +# define BACKTRACE_ENABLE 0 +# endif /* __has_feature(address_sanitizer) */ +#elif defined(__SANITIZE_ADDRESS__) && !defined(BACKTRACE_ENABLE) /* GCC compiler */ +# define BACKTRACE_ENABLE 0 +#endif + +#if !defined(BACKTRACE_ENABLE) +/* automatic detector : backtrace enabled by default on linux+glibc and osx */ +# if (defined(__linux__) && defined(__GLIBC__)) \ + || (defined(__APPLE__) && defined(__MACH__)) +# define BACKTRACE_ENABLE 1 +# else +# define BACKTRACE_ENABLE 0 +# endif +#endif + +/* note : after this point, BACKTRACE_ENABLE is necessarily defined */ + + +#if BACKTRACE_ENABLE + +#include /* backtrace, backtrace_symbols */ #define MAX_STACK_FRAMES 50 @@ -208,7 +222,7 @@ static void ABRThandler(int sig) { void FIO_addAbortHandler() { -#ifdef BACKTRACES_ENABLE +#if BACKTRACE_ENABLE signal(SIGABRT, ABRThandler); signal(SIGFPE, ABRThandler); signal(SIGILL, ABRThandler);