]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Refactor abort signal handling
authorCasey McGinty <casey.mcginty@gmail.com>
Tue, 11 Sep 2018 17:40:45 +0000 (10:40 -0700)
committerCasey McGinty <casey.mcginty@gmail.com>
Tue, 11 Sep 2018 17:40:45 +0000 (10:40 -0700)
- Print signal name to term
- Add -rdynamic option to generate Linux symbol names in backtrace
- Raise default signal after handler to ensure program termination

lib/common/zstd_common.c
programs/Makefile

index d3ad057302e3d61c9a80a05191c21714d9b8077b..8377cf0fd45bf6927dfb73d4f95aba9101f834f4 100644 (file)
@@ -98,15 +98,30 @@ void ZSTD_free(void* ptr, ZSTD_customMem customMem)
 #define MAX_STACK_FRAMES    50
 
 #ifndef _WIN32
+
+#ifdef __linux__
+#define START_STACK_FRAME  2
+#elif defined __APPLE__
+#define START_STACK_FRAME  4
+#endif
+
 static void ABRThandler(int sig)
 {
+   const char* name;
    void* addrlist[MAX_STACK_FRAMES + 1];
    char** symbollist;
    U32 addrlen, i;
 
-   (void)sig;
+   switch (sig) {
+      case SIGABRT: name = "SIGABRT"; break;
+      case SIGFPE:  name = "SIGFPE"; break;
+      case SIGILL:  name = "SIGILL"; break;
+      case SIGINT:  name = "SIGINT"; break;
+      case SIGSEGV: name = "SIGSEGV"; break;
+      default: name = "UNKNOWN"; break;
+   }
 
-   DISPLAY("Stack trace:\n");
+   DISPLAY("Caught %s signal, printing stack:\n", name);
    // Retrieve current stack addresses.
    addrlen = backtrace(addrlist, sizeof(addrlist) / sizeof(void*));
    if (addrlen == 0) {
@@ -116,10 +131,13 @@ static void ABRThandler(int sig)
    // Create readable strings to each frame.
    symbollist = backtrace_symbols(addrlist, addrlen);
    // Print the stack trace, excluding calls handling the signal.
-   for (i = 4; i < addrlen; i++) {
+   for (i = START_STACK_FRAME; i < addrlen; i++) {
       DISPLAY("%s\n", symbollist[i]);
    }
    free(symbollist);
+   // Reset and raise the signal so default handler runs.
+   signal(sig, SIG_DFL);
+   raise(sig);
 }
 #endif
 
index 912f9eff06e25db1f4cb21dd6f913e12066942d5..49319484c301fb226103986c4eef82deb31391f3 100644 (file)
@@ -48,6 +48,7 @@ DEBUGFLAGS+=-Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \
             -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \
             -Wredundant-decls
 CFLAGS  += $(DEBUGFLAGS) $(MOREFLAGS)
+LDFLAGS += -rdynamic
 FLAGS    = $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)