X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbcsignals.C;h=bb3e59580e2e2ea9abacf378f5b5640e052c2957;hb=9bdcade2e925eed0fdff09902b2e2aa1a99f8573;hp=793666cd1ca53262be65b034680817b939e05bce;hpb=5249bc8407920effc00e13940d3d4ccea0dd5d9f;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/bcsignals.C b/cinelerra-5.1/guicast/bcsignals.C index 793666cd..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 @@ -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;