diff --git a/Makefile.am b/Makefile.am index 4dad3e63..81f75b11 100644 --- a/Makefile.am +++ b/Makefile.am @@ -23,6 +23,7 @@ endif CFLAGS += -Wno-unused-parameter -Wno-unused-variable CFLAGS += -Ilibssh/include/ -Imsgpack/src +CFLAGS += -rdynamic # for stack traces if IS_DEVENV CFLAGS += -DDEVENV diff --git a/tmate-debug.c b/tmate-debug.c index f69bcdc5..46bda6fe 100644 --- a/tmate-debug.c +++ b/tmate-debug.c @@ -59,8 +59,8 @@ void tmate_print_trace(void) char **strings; size_t i; - size = backtrace (array, 20); - strings = backtrace_symbols (array, size); + size = backtrace(array, 20); + strings = backtrace_symbols(array, size); tmate_info("============ %zd stack frames ============", size); @@ -71,5 +71,11 @@ void tmate_print_trace(void) tmate_info("%s", strings[i]); } - free (strings); + free(strings); +} + +void tmate_preload_trace_lib(void) +{ + void *array[0]; + backtrace(array, 0); } diff --git a/tmate-slave.c b/tmate-slave.c index 2942e779..5ff5311c 100644 --- a/tmate-slave.c +++ b/tmate-slave.c @@ -61,6 +61,8 @@ int main(int argc, char **argv) (mkdir(TMATE_WORKDIR "/jail", 0700) < 0 && errno != EEXIST)) tmate_fatal("Cannot prepare session in " TMATE_WORKDIR); + tmate_preload_trace_lib(); + tmate_ssh_server_main(port); return 0; } diff --git a/tmate-ssh-server.c b/tmate-ssh-server.c index 6908386a..b7344f05 100644 --- a/tmate-ssh-server.c +++ b/tmate-ssh-server.c @@ -189,11 +189,18 @@ static void handle_sigalrm(void) tmate_fatal("Connection grace period (%d) passed", SSH_GRACE_PERIOD); } +static void handle_sigsegv(void) +{ + tmate_print_trace(); + tmate_fatal("CRASH"); +} + static void signal_handler(int sig) { switch (sig) { case SIGCHLD: handle_sigchld(); break; case SIGALRM: handle_sigalrm(); break; + case SIGSEGV: handle_sigsegv(); break; } } @@ -201,6 +208,7 @@ static void setup_signals(void) { signal(SIGCHLD, signal_handler); signal(SIGALRM, signal_handler); + signal(SIGSEGV, signal_handler); } static void ssh_log_cb(ssh_session session, int priority, diff --git a/tmate.h b/tmate.h index 792f4781..50ac3b57 100644 --- a/tmate.h +++ b/tmate.h @@ -137,6 +137,7 @@ extern const char *tmate_session_token; extern void tmate_spawn_slave(struct tmate_ssh_client *client); /* tmate-debug.c */ +extern void tmate_preload_trace_lib(void); extern void tmate_print_trace(void); /* tmux-bare.c */