X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbcsignals.C;h=bb3e59580e2e2ea9abacf378f5b5640e052c2957;hb=29368703cfeb89b567e60dc9f25a1df3733bea68;hp=3886cd64579e3663d1c339889c1066c5d8483dc0;hpb=1f78d86b5532943b2a3ea51f409a1fe5bd961e02;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/bcsignals.C b/cinelerra-5.1/guicast/bcsignals.C index 3886cd64..bb3e5958 100644 --- a/cinelerra-5.1/guicast/bcsignals.C +++ b/cinelerra-5.1/guicast/bcsignals.C @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -508,8 +509,8 @@ int BC_Signals::x_error_handler(Display *display, XErrorEvent *event) { char string[1024]; XGetErrorText(event->display, event->error_code, string, 1024); - fprintf(stderr, "BC_Signals::x_error_handler: error_code=%d opcode=%d,%d %s\n", - event->error_code, event->request_code, event->minor_code, string); + fprintf(stderr, "BC_Signals::x_error_handler: error_code=%d opcode=%d,%d id=0x%jx %s\n", + event->error_code, event->request_code, event->minor_code, event->resourceid, string); return 0; } @@ -835,9 +836,10 @@ static void handle_dump(int n, siginfo_t * info, void *sc) ucontext_t *uc = (ucontext_t *)sc; int pid = getpid(), tid = gettid(); struct sigcontext *c = (struct sigcontext *)&uc->uc_mcontext; + uint8_t *ip = (uint8_t *)c->IP; fprintf(stderr,"** %s at %p in pid %d, tid %d\n", n==SIGSEGV? "segv" : n==SIGINT? "intr" : "trap", - (void*)c->IP, pid, tid); + (void*)ip, pid, tid); FILE *fp = 0; char fn[PATH_MAX]; if( BC_Signals::trap_path ) { @@ -874,6 +876,27 @@ static void handle_dump(int n, siginfo_t * info, void *sc) fprintf(fp,"\nVERSION:\n"); bc_copy_textfile(INT_MAX, fp,"/proc/version"); fprintf(fp,"\nMEMINFO:\n"); bc_copy_textfile(INT_MAX, fp,"/proc/meminfo"); fprintf(fp,"\nMAPS:\n"); bc_copy_textfile(INT_MAX, fp,"/proc/%d/maps",pid); + char proc_mem[64]; + if( tid > 0 && tid != pid ) + sprintf(proc_mem,"/proc/%d/task/%d/mem",pid,tid); + else + sprintf(proc_mem,"/proc/%d/mem",pid); + int pfd = open(proc_mem,O_RDONLY); + if( pfd >= 0 ) { + fprintf(fp,"\nCODE:\n"); + for( int i=-32; i<32; ) { + uint8_t v; void *vp = (void *)(ip + i); + if( !(i & 7) ) fprintf(fp,"%p: ", vp); + if( pread(pfd,&v,sizeof(v),(off_t)vp) != sizeof(v) ) break; + fprintf(fp,"%c%02x", !i ? '>' : ' ', v); + if( !(++i & 7) ) fprintf(fp,"\n"); + } + fprintf(fp,"\n"); + close(pfd); + } + else + fprintf(fp,"err opening: %s, %m\n", proc_mem); + fprintf(fp,"\n\n"); if( fp != stdout ) fclose(fp); char cmd[1024], *cp = cmd;