1: # 2: /* 3: * 4: * UNIX debugger 5: * 6: */ 7: 8: #include "defs.h" 9: 10: 11: MSG NOBKPT; 12: MSG SZBKPT; 13: MSG EXBKPT; 14: MSG NOPCS; 15: MSG BADMOD; 16: 17: /* breakpoints */ 18: BKPTR bkpthead; 19: 20: CHAR *lp; 21: CHAR lastc; 22: POS corhdr[512]; 23: POS *endhdr; 24: 25: INT signo; 26: L_INT dot; 27: INT pid; 28: L_INT cntval; 29: L_INT loopcnt; 30: 31: 32: 33: /* sub process control */ 34: 35: subpcs(modif) 36: { 37: REG INT check; 38: INT execsig; 39: INT runmode; 40: REG BKPTR bkptr; 41: STRING comptr; 42: execsig=0; loopcnt=cntval; 43: 44: switch(modif) { 45: 46: /* delete breakpoint */ 47: case 'd': case 'D': 48: IF (bkptr=scanbkpt(shorten(dot))) 49: THEN bkptr->flag=0; return; 50: ELSE error(NOBKPT); 51: FI 52: 53: /* set breakpoint */ 54: case 'b': case 'B': 55: IF (bkptr=scanbkpt(shorten(dot))) 56: THEN bkptr->flag=0; 57: FI 58: FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt 59: DO IF bkptr->flag == 0 60: THEN break; 61: FI 62: OD 63: IF bkptr==0 64: THEN IF (bkptr=sbrk(sizeof *bkptr)) == -1 65: THEN error(SZBKPT); 66: ELSE bkptr->nxtbkpt=bkpthead; 67: bkpthead=bkptr; 68: FI 69: FI 70: bkptr->loc = dot; 71: bkptr->initcnt = bkptr->count = cntval; 72: bkptr->flag = BKPTSET; 73: check=MAXCOM-1; comptr=bkptr->comm; rdc(); lp--; 74: REP *comptr++ = readchar(); 75: PER check-- ANDF lastc!=EOR DONE 76: *comptr=0; lp--; 77: IF check 78: THEN return; 79: ELSE error(EXBKPT); 80: FI 81: 82: /* exit */ 83: case 'k' :case 'K': 84: IF pid 85: THEN printf("%d: killed", pid); endpcs(); return; 86: FI 87: error(NOPCS); 88: 89: /* run program */ 90: case 'r': case 'R': 91: endpcs(); 92: setup(); 93: runmode=CONTIN; 94: break; 95: 96: /* single step */ 97: case 's': case 'S': 98: runmode=SINGLE; 99: IF pid 100: THEN execsig=getsig(signo); 101: ELSE setup(); loopcnt--; 102: FI 103: break; 104: 105: /* continue with optional signal */ 106: case 'c': case 'C': case 0: 107: IF pid==0 THEN error(NOPCS); FI 108: runmode=CONTIN; 109: execsig=getsig(signo); 110: break; 111: 112: default: error(BADMOD); 113: } 114: 115: IF loopcnt>0 ANDF runpcs(runmode, execsig) 116: THEN printf("breakpoint%16t"); 117: ELSE printf("stopped at%16t"); 118: FI 119: delbp(); 120: printpc(); 121: }