X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmiracle%2Fmiracle_local.c;h=51663d90a2d7b1c6e76042c11f2067dfe69fec48;hb=62b1b24b4dab2b17c3ec052955584f9070c77865;hp=501487a4925946422dcb6d280735b22d890af8ce;hpb=281579567f77944a2130b00e91ca8b8142df6e0b;p=melted diff --git a/src/miracle/miracle_local.c b/src/miracle/miracle_local.c index 501487a..51663d9 100644 --- a/src/miracle/miracle_local.c +++ b/src/miracle/miracle_local.c @@ -26,6 +26,8 @@ #include #include #include +#include +#include /* Valerie header files */ #include @@ -286,6 +288,31 @@ void signal_handler( int sig ) } } +static void sigsegv_handler() +{ + void *array[ 10 ]; + size_t size; + char **strings; + size_t i; + + fprintf( stderr, "\a\nMiracle experienced a segmentation fault.\n" + "Dumping stack from the offending thread\n\n" ); + size = backtrace( array, 10 ); + strings = backtrace_symbols( array, size ); + + fprintf( stderr, "Obtained %zd stack frames.\n", size ); + + for ( i = 0; i < size; i++ ) + fprintf( stderr, "%s\n", strings[ i ] ); + + free( strings ); + + fprintf( stderr, "\nDone dumping - exiting.\n" ); + exit( EXIT_FAILURE ); +} + + + /** Local 'connect' function. */ @@ -304,6 +331,7 @@ static valerie_response miracle_local_connect( miracle_local local ) signal( SIGPIPE, signal_handler ); signal( SIGALRM, signal_handler ); signal( SIGCHLD, SIG_IGN ); + signal( SIGSEGV, sigsegv_handler ); return response; }