diff --git a/src/mzscheme/gc2/sighand.c b/src/mzscheme/gc2/sighand.c index cd4e8a8f28..dc3902920a 100644 --- a/src/mzscheme/gc2/sighand.c +++ b/src/mzscheme/gc2/sighand.c @@ -14,12 +14,30 @@ /* ========== Linux signal handler ========== */ #if defined(linux) -# include +#include +#include +#include + +static void launchgdb() { + pid_t pid = getpid(); + char inbuffer[10]; + + fprintf(stderr, "pid # %i run gdb \"gdb ./mzscheme3m %i\" or kill process.\n", pid, pid); + fflush(stderr); + + while(read(fileno(stdin), inbuffer, 10) <= 0){ + if(errno != EINTR){ + fprintf(stderr, "Error detected %i\n", errno); + } + } +} + void fault_handler(int sn, struct siginfo *si, void *ctx) { void *p = si->si_addr; if (si->si_code != SEGV_ACCERR) { /*SEGV_MAPERR*/ printf("SIGSEGV fault on %p\n", p); + launchgdb(); abort(); } diff --git a/src/mzscheme/src/mzrt.c b/src/mzscheme/src/mzrt.c index 05b2f2be27..3e94f127f0 100644 --- a/src/mzscheme/src/mzrt.c +++ b/src/mzscheme/src/mzrt.c @@ -43,29 +43,30 @@ void mzrt_set_user_break_handler(void (*user_break_handler)(int)) #endif } -static void segfault_handler(int signal_num) { +static void rungdb() { #ifdef WIN32 #else pid_t pid = getpid(); - char buffer[500]; - char buf[500]; - signal(SIGSEGV, segfault_handler); + char outbuffer[100]; + char inbuffer[10]; - fprintf(stderr, "%i %i resume(r)/gdb(d)/exit(e)?\n", signal_num, pid); + fprintf(stderr, "pid # %i resume(r)/gdb(d)/exit(e)?\n", pid); fflush(stderr); - while(read(fileno(stdin), buf, 100) <= 0){ - if(errno != EINTR){ - fprintf(stderr, "\nCould not read response, sleeping for 20 seconds.\n"); + while(1) { + while(read(fileno(stdin), inbuffer, 10) <= 0){ + if(errno != EINTR){ + fprintf(stderr, "Error detected %i\n", errno); + } } - switch(buf[0]) { + switch(inbuffer[0]) { case 'r': return; break; case 'd': - snprintf(buffer, 500, "xterm -e gdb ./mzschemecgc %d &", pid); - fprintf(stderr, "%i %i Launching GDB", signal_num, pid); - system(buffer); + snprintf(outbuffer, 100, "xterm -e gdb ./mzscheme3m %d &", pid); + fprintf(stderr, "%s\n", outbuffer); + system(outbuffer); break; case 'e': default: @@ -76,6 +77,13 @@ static void segfault_handler(int signal_num) { #endif } +static void segfault_handler(int signal_num) { + pid_t pid = getpid(); + fprintf(stderr, "sig# %i pid# %i\n", signal_num, pid); + rungdb(); +} + + void mzrt_set_segfault_debug_handler() { #ifdef WIN32