34 #include <sys/types.h>
38 #include <sys/prctl.h>
45 #define BACKTRACE_SZ 100
49 static int yaz_panic_fd = -1;
51 static void yaz_invoke_gdb(
void)
53 int fd = yaz_panic_fd;
58 const char *cp =
"backtrace: pipe failed\n";
59 write(fd, cp, strlen(cp));
63 if (pid == (pid_t) (-1))
65 const char *cp =
"backtrace: fork failure\n";
66 write(fd, cp, strlen(cp));
73 const char *cp =
"backtrace: could not exec gdb\n";
88 arg[
arg_no++] =
"/usr/bin/gdb";
92 arg[
arg_no++] =
"info threads";
94 arg[
arg_no++] =
"thread apply all bt";
100 write(2, cp, strlen(cp));
107 #ifdef PR_SET_PTRACER
108 prctl(PR_SET_PTRACER, pid, 0, 0, 0);
111 write(fds[1],
"quit\n", 5);
115 pid_t s = waitpid(pid, &status, WNOHANG);
125 write(fds[1],
"quit\n", 5);
133 static int yaz_panic_signal = 0;
134 static void yaz_panic_alarm(
int sig)
136 const char *cp =
"backtrace: backtrace hangs\n";
138 write(yaz_panic_fd, cp, strlen(cp));
142 static void yaz_invoke_backtrace(
int sig)
144 int fd = yaz_panic_fd;
148 yaz_panic_signal = sig;
149 signal(SIGALRM, yaz_panic_alarm);
151 sz = backtrace(backtrace_info, sz);
152 backtrace_symbols_fd(backtrace_info, sz, fd);
156 static void yaz_panic_sig_handler(
int sig)
161 signal(SIGABRT, SIG_DFL);
162 signal(SIGSEGV, SIG_DFL);
163 signal(SIGFPE, SIG_DFL);
164 signal(SIGBUS, SIG_DFL);
165 strcpy(buf,
"\nYAZ panic received ");
169 strcat(buf,
"SIGSEGV");
172 strcat(buf,
"SIGABRT");
175 strcat(buf,
"SIGFPE");
178 strcat(buf,
"SIGBUS");
181 yaz_snprintf(buf + strlen(buf),
sizeof buf,
"signo=%d", sig);
184 yaz_snprintf(buf + strlen(buf),
sizeof(buf) - strlen(buf) - 1,
189 yaz_panic_fd = fileno(file);
191 write(yaz_panic_fd, buf, strlen(buf));
192 yaz_invoke_backtrace(sig);
203 signal(SIGABRT, yaz_panic_sig_handler);
204 signal(SIGSEGV, yaz_panic_sig_handler);
205 signal(SIGFPE, yaz_panic_sig_handler);
206 signal(SIGBUS, yaz_panic_sig_handler);
static char static_progname[256]
void yaz_enable_panic_backtrace(const char *progname)
enables backtrace when SIGSEGV/SIGABRT/.. signal is received
Header for errno utilities.
FILE * yaz_log_file(void)
returns FILE handle for log or NULL if no file is in use
Header for Nibble Memory functions.
void yaz_snprintf(char *buf, size_t size, const char *fmt,...)
Header for config file reading utilities.
Header with fundamental macros.