Better places SIGWEGV debugging

svn: r12816
This commit is contained in:
Kevin Tew 2008-12-12 19:36:26 +00:00
parent 27a5a47700
commit e8aae67e82
2 changed files with 39 additions and 13 deletions

View File

@ -14,12 +14,30 @@
/* ========== Linux signal handler ========== */
#if defined(linux)
# include <signal.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
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();
}

View File

@ -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