#define BACKTRACE_SZ 100
static char static_progname[256];
+#if HAVE_EXECINFO_H
static void yaz_invoke_backtrace(char *buf, int buf_sz)
{
FILE *file = yaz_log_file();
int fd = fileno(file);
-#if HAVE_EXECINFO_H
pid_t pid;
int fds[2];
void *backtrace_info[BACKTRACE_SZ];
sz = backtrace(backtrace_info, sz);
backtrace_symbols_fd(backtrace_info, sz, fd);
- pipe(fds);
+ if (pipe(fds) == -1)
+ {
+ const char *cp = "backtrace: pipe failed\n";
+ write(fd, cp, strlen(cp));
+ return;
+ }
pid = fork();
if (pid == (pid_t) (-1))
{ /* error */
- const char *cp = "backtrace: fork failure";
+ const char *cp = "backtrace: fork failure\n";
write(fd, cp, strlen(cp));
}
else if (pid == 0)
char *arg[20];
int arg_no = 0;
char pidstr[40];
- const char *cp = "backtrace: could not exec gdb";
+ const char *cp = "backtrace: could not exec gdb\n";
close(fds[1]);
close(0);
}
close(fds[1]);
}
-#else
- strcat(buf, "no backtrace support (execinfo.h not found)\n");
- write(fd, buf, strlen(buf));
-#endif
}
static void yaz_panic_sig_handler(int sig)
yaz_invoke_backtrace(buf, sizeof buf);
abort();
}
+#endif
void yaz_enable_panic_backtrace(const char *progname)
{
strncpy(static_progname, progname, sizeof(static_progname) - 1);
static_progname[sizeof(static_progname) - 1] = '\0';
#if HAVE_EXECINFO_H
+ void *bt[1];
+ backtrace(bt, 1);
+
signal(SIGABRT, yaz_panic_sig_handler);
signal(SIGSEGV, yaz_panic_sig_handler);
signal(SIGFPE, yaz_panic_sig_handler);