45#define BACKTRACE_SZ 100
49static int yaz_panic_fd = -1;
51static void iwrite(
int fd,
const char *buf,
size_t len)
55 ssize_t r = write(fd, buf, len);
67static void yaz_invoke_gdb(
void)
69 int fd = yaz_panic_fd;
74 const char *cp =
"backtrace: pipe failed\n";
75 iwrite(fd, cp, strlen(cp));
79 if (pid == (pid_t) (-1))
81 const char *cp =
"backtrace: fork failure\n";
82 iwrite(fd, cp, strlen(cp));
89 const char *cp =
"backtrace: could not exec gdb\n";
107 arg[
arg_no++] =
"/usr/bin/gdb";
111 arg[
arg_no++] =
"info threads";
113 arg[
arg_no++] =
"thread apply all bt";
119 iwrite(2, cp, strlen(cp));
127 prctl(PR_SET_PTRACER, pid, 0, 0, 0);
130 iwrite(fds[1],
"quit\n", 5);
134 pid_t s = waitpid(pid, &status, WNOHANG);
144 iwrite(fds[1],
"quit\n", 5);
152static int yaz_panic_signal = 0;
153static void yaz_panic_alarm(
int sig)
155 const char *cp =
"backtrace: backtrace hangs\n";
157 iwrite(yaz_panic_fd, cp, strlen(cp));
161static void yaz_invoke_backtrace(
int sig)
163 int fd = yaz_panic_fd;
167 yaz_panic_signal = sig;
168 signal(SIGALRM, yaz_panic_alarm);
170 sz = backtrace(backtrace_info, sz);
171 backtrace_symbols_fd(backtrace_info, sz, fd);
175static void yaz_panic_sig_handler(
int sig)
180 signal(SIGABRT, SIG_DFL);
181 signal(SIGSEGV, SIG_DFL);
182 signal(SIGFPE, SIG_DFL);
183 signal(SIGBUS, SIG_DFL);
184 strcpy(buf,
"\nYAZ panic received ");
188 strcat(buf,
"SIGSEGV");
191 strcat(buf,
"SIGABRT");
194 strcat(buf,
"SIGFPE");
197 strcat(buf,
"SIGBUS");
200 yaz_snprintf(buf + strlen(buf),
sizeof buf,
"signo=%d", sig);
203 yaz_snprintf(buf + strlen(buf),
sizeof(buf) - strlen(buf) - 1,
208 yaz_panic_fd = fileno(file);
210 iwrite(yaz_panic_fd, buf, strlen(buf));
211 yaz_invoke_backtrace(sig);
222 signal(SIGABRT, yaz_panic_sig_handler);
223 signal(SIGSEGV, yaz_panic_sig_handler);
224 signal(SIGFPE, yaz_panic_sig_handler);
225 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.
int nmem_int_t
BER/utility integer (32-bit on most platforms)
#define NMEM_INT_PRINTF
printf format for nmem_int_t type
void yaz_snprintf(char *buf, size_t size, const char *fmt,...)
Header for config file reading utilities.
Header with fundamental macros.