@@ -362,8 +362,33 @@ int chassis_frontend_set_chassis_options(chassis_frontend_t *frontend, chassis_o
362362 return 0 ;
363363}
364364
365- static void sigsegv_handler (int G_GNUC_UNUSED signum ) {
366- g_on_error_stack_trace (g_get_prgname ());
365+ static inline void print_stacktrace (int signum ) {
366+ int j , nptrs ;
367+ void * buffer [MAX_FRAMES + 1 ];
368+ gchar * signal_str = g_strdup (strsignal (signum ));
369+ if (signal_str ){
370+ g_log_dbproxy (g_warning , "[backtrace] signal:%s(%d) stack trace:" , signal_str , signum );
371+ g_free (signal_str );
372+ }
373+ else {
374+ g_log_dbproxy (g_warning , "[backtrace] signal: (%d) stack trace:" , signum );
375+ }
376+
377+ nptrs = backtrace (buffer , MAX_FRAMES );
378+ char * * strings = backtrace_symbols (buffer , nptrs );
379+ if (strings == NULL ) {
380+ g_log_dbproxy (g_warning , "[backtrace] no backtrace symbols" );
381+ return ;
382+ }
383+ for (j = 0 ; j < nptrs ; j ++ ){
384+ g_log_dbproxy (g_warning , "[backtrace] %-3d: %s" , j , strings [j ]);
385+ }
386+ free (strings );
387+ }
388+
389+ static void sigsegv_handler (int signum ) {
390+ print_stacktrace (signum );
391+ //g_on_error_stack_trace(g_get_prgname());
367392 abort (); /* trigger a SIGABRT instead of just exiting */
368393}
369394
@@ -643,9 +668,16 @@ int main_cmdline(int argc, char **argv) {
643668 sigsegv_sa .sa_handler = sigsegv_handler ;
644669 sigemptyset (& sigsegv_sa .sa_mask );
645670
646- if (frontend -> invoke_dbg_on_crash && !(RUNNING_ON_VALGRIND )) {
647- sigaction (SIGSEGV , & sigsegv_sa , NULL );
648- }
671+ sigaction (SIGSEGV , & sigsegv_sa , NULL );
672+ #ifdef SIGBUS
673+ sigaction (SIGBUS , & sigsegv_sa , NULL );
674+ #endif
675+ sigaction (SIGILL , & sigsegv_sa , NULL );
676+ sigaction (SIGFPE , & sigsegv_sa , NULL );
677+
678+ /*if (frontend->invoke_dbg_on_crash && !(RUNNING_ON_VALGRIND)) {
679+ sigaction(SIGSEGV, &sigsegv_sa, NULL);
680+ }*/
649681#endif
650682
651683 /*
@@ -1014,9 +1046,15 @@ int main_cmdline(int argc, char **argv) {
10141046#ifdef HAVE_SIGACTION
10151047 /* reset the handler */
10161048 sigsegv_sa .sa_handler = SIG_DFL ;
1017- if (frontend -> invoke_dbg_on_crash && !(RUNNING_ON_VALGRIND )) {
1049+ /* if (frontend->invoke_dbg_on_crash && !(RUNNING_ON_VALGRIND)) {
10181050 sigaction(SIGSEGV, &sigsegv_sa, NULL);
1019- }
1051+ }*/
1052+ sigaction (SIGSEGV , & sigsegv_sa , NULL );
1053+ #ifdef SIGBUS
1054+ sigaction (SIGBUS , & sigsegv_sa , NULL );
1055+ #endif
1056+ sigaction (SIGILL , & sigsegv_sa , NULL );
1057+ sigaction (SIGFPE , & sigsegv_sa , NULL );
10201058#endif
10211059 chassis_frontend_free (frontend );
10221060
0 commit comments