1: # 2: /* 3: * 4: * UNIX debugger 5: * 6: */ 7: 8: #include "defs.h" 9: 10: 11: MSG NOFORK; 12: MSG ENDPCS; 13: MSG BADWAIT; 14: 15: CHAR *lp; 16: INT sigint; 17: INT sigqit; 18: 19: /* breakpoints */ 20: BKPTR bkpthead; 21: 22: REGLIST reglist[]; 23: 24: CHAR lastc; 25: POS corhdr[]; 26: POS *endhdr; 27: 28: INT fcor; 29: INT fsym; 30: STRING errflg; 31: INT errno; 32: INT signo; 33: 34: L_INT dot; 35: STRING symfil; 36: INT wtflag; 37: INT pid; 38: L_INT expv; 39: INT adrflg; 40: L_INT loopcnt; 41: 42: 43: 44: 45: 46: /* service routines for sub process control */ 47: 48: getsig(sig) 49: { return(expr(0) ? shorten(expv) : sig); 50: } 51: 52: INT userpc=1; 53: 54: runpcs(runmode, execsig) 55: { 56: INT rc; 57: REG BKPTR bkpt; 58: IF adrflg 59: THEN userpc=shorten(dot); 60: FI 61: setbp(); 62: printf("%s: running\n", symfil); 63: 64: WHILE (loopcnt--)>0 65: DO 66: #ifdef DEBUG 67: printf("\ncontinue %d %d\n",userpc,execsig); 68: #endif 69: stty(0,&usrtty); 70: ptrace(runmode,pid,userpc,execsig); 71: bpwait(); chkerr(); readregs(); 72: 73: /*look for bkpt*/ 74: IF signo==0 ANDF (bkpt=scanbkpt(endhdr[pc]-2)) 75: THEN /*stopped at bkpt*/ 76: userpc=endhdr[pc]=bkpt->loc; 77: IF bkpt->flag==BKPTEXEC 78: ORF ((bkpt->flag=BKPTEXEC, command(bkpt->comm,':')) ANDF --bkpt->count) 79: THEN execbkpt(bkpt); execsig=0; loopcnt++; 80: userpc=1; 81: ELSE bkpt->count=bkpt->initcnt; 82: rc=1; 83: FI 84: ELSE rc=0; execsig=signo; userpc=1; 85: FI 86: OD 87: return(rc); 88: } 89: 90: endpcs() 91: { 92: REG BKPTR bkptr; 93: IF pid 94: THEN ptrace(EXIT,pid,0,0); pid=0; userpc=1; 95: FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt 96: DO IF bkptr->flag 97: THEN bkptr->flag=BKPTSET; 98: FI 99: OD 100: FI 101: } 102: 103: setup() 104: { 105: close(fsym); fsym = -1; 106: IF (pid = fork()) == 0 107: THEN ptrace(SETTRC,0,0,0); 108: signal(SIGINT,sigint); signal(SIGQUIT,sigqit); 109: doexec(); exit(0); 110: ELIF pid == -1 111: THEN error(NOFORK); 112: ELSE bpwait(); readregs(); lp[0]=EOR; lp[1]=0; 113: fsym=open(symfil,wtflag); 114: IF errflg 115: THEN printf("%s: cannot execute\n",symfil); 116: endpcs(); error(0); 117: FI 118: FI 119: } 120: 121: execbkpt(bkptr) 122: BKPTR bkptr; 123: { INT bkptloc; 124: #ifdef DEBUG 125: printf("exbkpt: %d\n",bkptr->count); 126: #endif 127: bkptloc = bkptr->loc; 128: ptrace(WIUSER,pid,bkptloc,bkptr->ins); 129: stty(0,&usrtty); 130: ptrace(SINGLE,pid,bkptloc,0); 131: bpwait(); chkerr(); 132: ptrace(WIUSER,pid,bkptloc,BPT); 133: bkptr->flag=BKPTSET; 134: } 135: 136: 137: doexec() 138: { 139: STRING argl[MAXARG]; 140: CHAR args[LINSIZ]; 141: STRING p, *ap, filnam; 142: ap=argl; p=args; 143: *ap++=symfil; 144: REP IF rdc()==EOR THEN break; FI 145: *ap = p; 146: WHILE lastc!=EOR ANDF lastc!=SP ANDF lastc!=TB DO *p++=lastc; readchar(); OD 147: *p++=0; filnam = *ap+1; 148: IF **ap=='<' 149: THEN close(0); 150: IF open(filnam,0)<0 151: THEN printf("%s: cannot open\n",filnam); exit(0); 152: FI 153: ELIF **ap=='>' 154: THEN close(1); 155: IF creat(filnam,0666)<0 156: THEN printf("%s: cannot create\n",filnam); exit(0); 157: FI 158: ELSE ap++; 159: FI 160: PER lastc!=EOR DONE 161: *ap++=0; 162: execv(symfil, argl); 163: } 164: 165: BKPTR scanbkpt(adr) 166: { 167: REG BKPTR bkptr; 168: FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt 169: DO IF bkptr->flag ANDF bkptr->loc==adr 170: THEN break; 171: FI 172: OD 173: return(bkptr); 174: } 175: 176: delbp() 177: { 178: REG INT a; 179: REG BKPTR bkptr; 180: FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt 181: DO IF bkptr->flag 182: THEN a=bkptr->loc; 183: ptrace(WIUSER,pid,a,bkptr->ins); 184: FI 185: OD 186: } 187: 188: setbp() 189: { 190: REG INT a; 191: REG BKPTR bkptr; 192: 193: FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt 194: DO IF bkptr->flag 195: THEN a = bkptr->loc; 196: bkptr->ins = ptrace(RIUSER, pid, a, 0); 197: ptrace(WIUSER, pid, a, BPT); 198: IF errno 199: THEN prints("cannot set breakpoint: "); 200: psymoff(leng(bkptr->loc),ISYM,"\n"); 201: FI 202: FI 203: OD 204: } 205: 206: bpwait() 207: { 208: REG INT w; 209: INT stat; 210: 211: signal(SIGINT, 1); 212: WHILE (w = wait(&stat))!=pid ANDF w != -1 DONE 213: signal(SIGINT,sigint); 214: gtty(0,&usrtty); 215: stty(0,&adbtty); 216: IF w == -1 217: THEN pid=0; 218: errflg=BADWAIT; 219: ELIF (stat & 0177) != 0177 220: THEN IF signo = stat&0177 221: THEN sigprint(); 222: FI 223: IF stat&0200 224: THEN prints(" - core dumped"); 225: close(fcor); 226: setcor(); 227: FI 228: pid=0; 229: errflg=ENDPCS; 230: ELSE signo = stat>>8; 231: IF signo!=SIGTRC 232: THEN sigprint(); 233: ELSE signo=0; 234: FI 235: flushbuf(); 236: FI 237: } 238: 239: readregs() 240: { 241: /*get REG values from pcs*/ 242: REG i; 243: FOR i=0; i<9; i++ 244: DO endhdr[reglist[i].roffs] = 245: ptrace(RUREGS, pid, 2*(512+reglist[i].roffs), 0); 246: OD 247: 248: /* REALing poINT */ 249: FOR i=FROFF; i<FRLEN+FROFF; i++ 250: DO corhdr[i] = ptrace(RUREGS,pid,i,0); OD 251: }