X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;ds=sidebyside;f=cinelerra-5.1%2Fguicast%2Fbcsignals.C;h=e7c14074e9715ac69e4e2eae408f8f605fd9b08c;hb=f30a92d2f983d5ec09c8fd8db48c9bcb7ec76763;hp=e2a8b149c42659c1744496f814e19c08797ef2aa;hpb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/bcsignals.C b/cinelerra-5.1/guicast/bcsignals.C index e2a8b149..e7c14074 100644 --- a/cinelerra-5.1/guicast/bcsignals.C +++ b/cinelerra-5.1/guicast/bcsignals.C @@ -21,11 +21,14 @@ #include "bcsignals.h" #include "bcwindowbase.h" +#include "bccmodels.h" #include "bckeyboard.h" +#include "bcresources.h" #include #include #include +#include #include #include #include @@ -126,14 +129,14 @@ static bc_buffertrace_t* new_bc_buffertrace(int size, void *ptr, const char *loc return result; } -static void bc_copy_textfile(FILE *ofp, const char *fmt,...) +static void bc_copy_textfile(int lines, FILE *ofp, const char *fmt,...) { va_list ap; va_start(ap, fmt); char bfr[BCTEXTLEN]; vsnprintf(bfr, sizeof(bfr), fmt, ap); va_end(ap); FILE *ifp = fopen(bfr,"r"); if( !ifp ) return; - while( fgets(bfr,sizeof(bfr),ifp) ) fputs(bfr,ofp); + while( --lines >= 0 && fgets(bfr,sizeof(bfr),ifp) ) fputs(bfr,ofp); fclose(ifp); } @@ -418,6 +421,10 @@ void BC_Signals::set_sighup_exit(int enable) BC_Signals::BC_Signals() { } +BC_Signals::~BC_Signals() +{ + BC_CModels::bcxfer_stop_slicers(); +} void BC_Signals::dump_traces(FILE *fp) { @@ -502,8 +509,9 @@ 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, + (int64_t)event->resourceid, string); return 0; } @@ -829,9 +837,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 ) { @@ -855,6 +864,8 @@ static void handle_dump(int n, siginfo_t * info, void *sc) fprintf(fp," by %d:%d %s(%s)\n", pw->pw_uid, pw->pw_gid, pw->pw_name, pw->pw_gecos); } + fprintf(fp,"\nCPUS: %d\n", BC_Resources::get_machine_cpus()); + fprintf(fp,"\nCPUINFO:\n"); bc_copy_textfile(32, fp,"/proc/cpuinfo"); fprintf(fp,"\nTHREADS:\n"); Thread::dump_threads(fp); fprintf(fp,"\nTRACES:\n"); BC_Signals::dump_traces(fp); fprintf(fp,"\nLOCKS:\n"); BC_Signals::dump_locks(fp); @@ -863,9 +874,30 @@ static void handle_dump(int n, siginfo_t * info, void *sc) fprintf(fp,"\nMAIN HOOK:\n"); BC_Signals::trap_hook(fp, BC_Signals::trap_data); } - fprintf(fp,"\nVERSION:\n"); bc_copy_textfile(fp,"/proc/version"); - fprintf(fp,"\nMEMINFO:\n"); bc_copy_textfile(fp,"/proc/meminfo"); - fprintf(fp,"\nMAPS:\n"); bc_copy_textfile(fp,"/proc/%d/maps",pid); + 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;