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: }

Defined functions

bpwait defined in line 206; used 3 times
delbp defined in line 176; never used
doexec defined in line 137; used 1 times
endpcs defined in line 90; used 1 times
execbkpt defined in line 121; used 1 times
  • in line 79
getsig defined in line 48; used 2 times
readregs defined in line 239; used 2 times
runpcs defined in line 54; used 1 times
scanbkpt defined in line 165; used 4 times
setbp defined in line 188; used 1 times
  • in line 61
setup defined in line 103; used 2 times
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 918
Valid CSS Valid XHTML 1.0 Strict