From bffb83c46e5702c8a6c17a31ae6e7a4e898258eb Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 27 Jun 2025 06:03:40 +0000 Subject: [PATCH] std::cout<) to give an Asynch-Signal safe backtrace. Avoid glibc backtrace due to mallocs. --- Grid/util/Init.cc | 306 ++++++++++++++++++++++++++++++---------------- 1 file changed, 203 insertions(+), 103 deletions(-) diff --git a/Grid/util/Init.cc b/Grid/util/Init.cc index f90eb276..18bdd14f 100644 --- a/Grid/util/Init.cc +++ b/Grid/util/Init.cc @@ -46,10 +46,14 @@ Author: paboyle #include #include + #include #include +#ifdef HAVE_UNWIND +#include +#endif #include #ifdef __APPLE__ @@ -295,8 +299,19 @@ void GridBanner(void) std::cout << std::setprecision(9); } -int fileno_stdout; -int fileno_stderr; +//Some file local variables +static int fileno_stdout; +static int fileno_stderr; +static int signal_delay; +class dlRegion { +public: + uint64_t start; + uint64_t end; + uint64_t size; + uint64_t offset; + std::string name; +}; +std::vector dlMap; void Grid_init(int *argc,char ***argv) { @@ -350,9 +365,16 @@ void Grid_init(int *argc,char ***argv) if( GridCmdOptionExists(*argv,*argv+*argc,"--debug-signals") ){ Grid_debug_handler_init(); } + // Sleep n-seconds at end of handler + if( GridCmdOptionExists(*argv,*argv+*argc,"--signal-delay") ){ + arg= GridCmdOptionPayload(*argv,*argv+*argc,"--signal-delay"); + GridCmdOptionInt(arg,signal_delay); + } + // periodic wakeup with stack trace printed if( GridCmdOptionExists(*argv,*argv+*argc,"--debug-heartbeat") ){ Grid_debug_heartbeat(); } + // periodic wakeup with empty handler (interrupts some system calls) if( GridCmdOptionExists(*argv,*argv+*argc,"--heartbeat") ){ Grid_heartbeat(); } @@ -414,9 +436,16 @@ void Grid_init(int *argc,char ***argv) std::cout << GridLogMessage << "================================================ "<=0 && dig< 16){ SIGLOG(digits[dig]); } } void sig_print_uint(uint32_t A) { - sig_print_dig((A/1000000000)%10); - sig_print_dig((A/100000000)%10); - sig_print_dig((A/10000000)%10); - sig_print_dig((A/1000000)%10); - sig_print_dig((A/100000)%10); - sig_print_dig((A/10000)%10); - sig_print_dig((A/1000)%10); - sig_print_dig((A/100)%10); - sig_print_dig((A/10)%10); - sig_print_dig((A/1)%10); + int dig; + int nz=0; +#define DIGIT(DIV) dig = (A/DIV)%10 ; if(dig|nz) sig_print_dig(dig); nz = nz|dig; + DIGIT(1000000000); // Catches 4BN = 2^32 + DIGIT(100000000); + DIGIT(10000000); + DIGIT(1000000); + DIGIT(100000); + DIGIT(10000); + DIGIT(1000); + DIGIT(100); + DIGIT(10); + DIGIT(1); + if (nz==0) SIGLOG("0"); } void sig_print_hex(uint64_t A) { - sig_print_dig((A>>7)&0xF); - sig_print_dig((A>>6)&0xF); - sig_print_dig((A>>5)&0xF); - sig_print_dig((A>>4)&0xF); - sig_print_dig((A>>3)&0xF); - sig_print_dig((A>>2)&0xF); - sig_print_dig((A>>1)&0xF); - sig_print_dig((A>>0)&0xF); + int nz=0; + int dig; +#define NIBBLE(A) dig = A ; if(dig|nz) sig_print_dig(dig); nz = nz|dig; + SIGLOG("0x"); + NIBBLE((A>>(15*4))&0xF); + NIBBLE((A>>(14*4))&0xF); + NIBBLE((A>>(13*4))&0xF); + NIBBLE((A>>(12*4))&0xF); + NIBBLE((A>>(11*4))&0xF); + NIBBLE((A>>(10*4))&0xF); + NIBBLE((A>>(9*4))&0xF); + NIBBLE((A>>(8*4))&0xF); + NIBBLE((A>>(7*4))&0xF); + NIBBLE((A>>(6*4))&0xF); + NIBBLE((A>>(5*4))&0xF); + NIBBLE((A>>(4*4))&0xF); + NIBBLE((A>>(3*4))&0xF); + NIBBLE((A>>(2*4))&0xF); + NIBBLE((A>>4)&0xF); + sig_print_dig(A&0xF); } - -void Grid_usr_signal_handler(int sig,siginfo_t *si,void * ptr) -{ - /* - fprintf(stderr,"Signal handler on host %s\n",hostname); - fprintf(stderr,"FlightRecorder step %d stage %s \n", - FlightRecorder::StepLoggingCounter, - FlightRecorder::StepName); - fprintf(stderr,"Caught signal %d\n",si->si_signo); - fprintf(stderr," process id %llu\n", (unsigned long long int)getpid()); - fprintf(stderr," mem address %llx\n",(unsigned long long)si->si_addr); - fprintf(stderr," code %d\n",si->si_code); - // x86 64bit +/* #ifdef __linux__ #ifdef __x86_64__ ucontext_t * uc= (ucontext_t *)ptr; @@ -623,79 +699,104 @@ void Grid_usr_signal_handler(int sig,siginfo_t *si,void * ptr) fprintf(stderr," instruction %llx\n",(unsigned long long)sc->rip); #endif #endif - fflush(stderr); - BACKTRACEFP(stderr); - fprintf(stderr,"Called backtrace\n"); - fflush(stdout); - fflush(stderr); - */ - SIGLOG("Signal handler on host "); - SIGLOG(hostname); - SIGLOG("\n"); - SIGLOG("FlightRecorder step "); - sig_print_uint(FlightRecorder::StepLoggingCounter); - SIGLOG("\n"); - SIGLOG("FlightRecorder stage "); - SIGLOG(FlightRecorder::StepName); - SIGLOG("\n"); - SIGLOG("Caught signal "); - sig_print_uint(si->si_signo); - SIGLOG("\n"); - SIGLOG(" process id "); - sig_print_uint((uint32_t)getpid()); - SIGLOG("\n"); - SIGLOG(" mem address "); - sig_print_hex((uint64_t)si->si_addr); - SIGLOG("\n"); - SIGLOG(" code "); - sig_print_uint(si->si_code); - SIGLOG("\n"); - - SIGLOG("Backtrace:\n"); - int symbols = backtrace (Grid_backtrace_buffer,_NBACKTRACE); - for (int i = 0; i < symbols; i++){ - sig_print_hex((uint64_t)Grid_backtrace_buffer[i]); - SIGLOG("\n"); - } - - return; -} - -void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr) +*/ +void Grid_generic_handler(int sig,siginfo_t *si,void * ptr) { SIGLOG("Signal handler on host "); SIGLOG(hostname); + SIGLOG(" process id "); + sig_print_uint((uint32_t)getpid()); SIGLOG("\n"); SIGLOG("FlightRecorder step "); sig_print_uint(FlightRecorder::StepLoggingCounter); - SIGLOG("\n"); - SIGLOG("FlightRecorder stage "); + SIGLOG(" stage "); SIGLOG(FlightRecorder::StepName); SIGLOG("\n"); SIGLOG("Caught signal "); sig_print_uint(si->si_signo); SIGLOG("\n"); - SIGLOG(" process id "); - sig_print_uint((uint32_t)getpid()); - SIGLOG("\n"); SIGLOG(" mem address "); sig_print_hex((uint64_t)si->si_addr); SIGLOG("\n"); SIGLOG(" code "); sig_print_uint(si->si_code); SIGLOG("\n"); + + ucontext_t *uc= (ucontext_t *)ptr; SIGLOG("Backtrace:\n"); - int symbols = backtrace (Grid_backtrace_buffer,_NBACKTRACE); - for (int i = 0; i < symbols; i++){ - sig_print_hex((uint64_t)Grid_backtrace_buffer[i]); - SIGLOG("\n"); +#ifdef HAVE_UNWIND + // Debug cross check on offsets + // int symbols = backtrace(Grid_backtrace_buffer,_NBACKTRACE); + // backtrace_symbols_fd(Grid_backtrace_buffer,symbols,fileno_stderr); + unw_cursor_t cursor; + unw_word_t ip, off; + if (!unw_init_local(&cursor, uc) ) { + + SIGLOG(" frame IP function\n"); + int level = 0; + int ret = 0; + while(1) { + char name[128]; + if (level >= _NBACKTRACE) return; + + unw_get_reg(&cursor, UNW_REG_IP, &ip); + + sig_print_uint(level); SIGLOG(" "); + sig_print_hex(ip); SIGLOG(" "); + for(int r=0;r=dlMap[r].start) &&(ip