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