# /* * * UNIX debugger * */ #include "defs.h" MSG LONGFIL; MSG NOTOPEN; MSG A68BAD; MSG A68LNK; MSG BADMOD; MAP txtmap; MAP datmap; SYMTAB symbol; INT lastframe; INT callpc; INT infile; INT outfile; CHAR *lp; INT maxoff; INT maxpos; INT octal; /* symbol management */ L_INT localval; /* breakpoints */ BKPTR bkpthead; REGLIST reglist [] { "ps", ps, "pc", pc, "sp", sp, "r5", r5, "r4", r4, "r3", r3, "r2", r2, "r1", r1, "r0", r0, }; INT frnames[] { 0, 3, 4, 5, 1, 2 }; char lastc; POS corhdr[]; POS *endhdr; INT fcor; STRING errflg; INT signo; L_INT dot; L_INT var[]; STRING symfil; STRING corfil; INT pid; L_INT adrval; INT adrflg; L_INT cntval; INT cntflg; STRING signals[] { "", "hangup", "interrupt", "quit", "illegal instruction", "trace/BPT", "IOT", "EMT", "floating exception", "killed", "bus error", "memory fault", "bad system call", "broken pipe", "alarm call", "terminated", }; /* general printing routines ($) */ printtrace(modif) { INT narg, i, stat, name, limit; POS dynam; REG BKPTR bkptr; CHAR hi, lo; INT word; STRING comptr; L_INT argp, frame, link; SYMPTR symp; IF cntflg==0 THEN cntval = -1; FI switch (modif) { case '<': case '>': {CHAR file[64]; INT index; index=0; IF modif=='<' THEN iclose(); ELSE oclose(); FI IF rdc()!=EOR THEN REP file[index++]=lastc; IF index>=63 THEN error(LONGFIL); FI PER readchar()!=EOR DONE file[index]=0; IF modif=='<' THEN infile=open(file,0); IF infile<0 THEN infile=0; error(NOTOPEN); FI ELSE outfile=open(file,1); IF outfile<0 THEN outfile=creat(file,0644); ELSE lseek(outfile,0L,2); FI FI FI lp--; } break; case 'o': octal = TRUE; break; case 'd': octal = FALSE; break; case 'q': case 'Q': case '%': done(); case 'w': case 'W': maxpos=(adrflg?adrval:MAXPOS); break; case 's': case 'S': maxoff=(adrflg?adrval:MAXOFF); break; case 'v': case 'V': prints("variables\n"); FOR i=0;i<=35;i++ DO IF var[i] THEN printc((i<=9 ? '0' : 'a'-10) + i); printf(" = %Q\n",var[i]); FI OD break; case 'm': case 'M': printmap("? map",&txtmap); printmap("/ map",&datmap); break; case 0: case '?': IF pid THEN printf("pcs id = %d\n",pid); ELSE prints("no process\n"); FI sigprint(); flushbuf(); case 'r': case 'R': printregs(); return; case 'f': case 'F': printfregs(modif=='F'); return; case 'c': case 'C': frame=(adrflg?adrval:endhdr[r5])&EVEN; lastframe=0; callpc=(adrflg?get(frame+2,DSP):endhdr[pc]); WHILE cntval-- DO chkerr(); narg = findroutine(frame); printf("%.8s(", symbol.symc); argp = frame+4; IF --narg >= 0 THEN printf("%o", get(argp, DSP)); FI WHILE --narg >= 0 DO argp += 2; printf(",%o", get(argp, DSP)); OD prints(")\n"); IF modif=='C' THEN WHILE localsym(frame) DO word=get(localval,DSP); printf("%8t%.8s:%10t", symbol.symc); IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%o\n",word); FI OD FI lastframe=frame; frame=get(frame, DSP)&EVEN; IF frame==0 THEN break; FI OD break; /*print externals*/ case 'e': case 'E': symset(); WHILE (symp=symget()) DO chkerr(); IF (symp->symf)==043 ORF (symp->symf)==044 THEN printf("%.8s:%12t%o\n", symp->symc, get(leng(symp->symv),DSP)); FI OD break; case 'a': case 'A': frame=(adrflg ? adrval : endhdr[r4]); WHILE cntval-- DO chkerr(); stat=get(frame,DSP); dynam=get(frame+2,DSP); link=get(frame+4,DSP); IF modif=='A' THEN printf("%8O:%8t%-8o,%-8o,%-8o",frame,stat,dynam,link); FI IF stat==1 THEN break; FI IF errflg THEN error(A68BAD); FI IF get(link-4,ISP)!=04767 THEN IF get(link-2,ISP)!=04775 THEN error(A68LNK); ELSE /*compute entry point of routine*/ prints(" ? "); FI ELSE printf("%8t"); valpr(name=shorten(link)+get(link-2,ISP),ISYM); name=get(leng(name-2),ISP); printf("%8t\""); limit=8; REP word=get(leng(name),DSP); name += 2; lo=word&LOBYTE; hi=(word>>8)&LOBYTE; printc(lo); printc(hi); PER lo ANDF hi ANDF limit-- DONE printc('"'); FI limit=4; i=6; printf("%24targs:%8t"); WHILE limit-- DO printf("%8t%o",get(frame+i,DSP)); i += 2; OD printc(EOR); frame=dynam; OD errflg=0; flushbuf(); break; /*set default c frame*/ /*print breakpoints*/ case 'b': case 'B': printf("breakpoints\ncount%8tbkpt%24tcommand\n"); FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt DO IF bkptr->flag THEN printf("%-8.8d",bkptr->count); psymoff(leng(bkptr->loc),ISYM,"%24t"); comptr=bkptr->comm; WHILE *comptr DO printc(*comptr++); OD FI OD break; default: error(BADMOD); } } printmap(s,amap) STRING s; MAP *amap; { int file; file=amap->ufd; printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil))); printf("b1 = %-16Q",amap->b1); printf("e1 = %-16Q",amap->e1); printf("f1 = %-16Q",amap->f1); printf("\nb2 = %-16Q",amap->b2); printf("e2 = %-16Q",amap->e2); printf("f2 = %-16Q",amap->f2); printc(EOR); } printfregs(longpr) { REG i; L_REAL f; printf("fpsr %o\n", corhdr[0].fpsr); FOR i=0; irname, v=endhdr[p->roffs]); valpr(v,(p->roffs==pc?ISYM:DSYM)); printc(EOR); OD printpc(); } getreg(regnam) { REG REGPTR p; REG STRING regptr; CHAR regnxt; regnxt=readchar(); FOR p=reglist; p<®list[9]; p++ DO regptr=p->rname; IF (regnam == *regptr++) ANDF (regnxt == *regptr) THEN return(p->roffs); FI OD lp--; return(0); } printpc() { dot=endhdr[pc]; psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP)); printc(EOR); } sigprint() { prints(signals[signo]); }