|
|
1.1 ! root 1: # ! 2: /* ! 3: * ! 4: * UNIX debugger ! 5: * ! 6: */ ! 7: ! 8: #include "defs.h" ! 9: SCCSID(@(#)pcs.c 2.3); ! 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: struct user u; ! 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,runmode; ! 39: REG BKPTR bkptr; ! 40: STRING comptr; ! 41: execsig=0; loopcnt=cntval; ! 42: ! 43: switch (modif) { ! 44: ! 45: /* delete breakpoint */ ! 46: case 'd': case 'D': ! 47: IF (bkptr=scanbkpt(dot)) ! 48: THEN bkptr->flag=0; return; ! 49: ELSE error(NOBKPT); ! 50: FI ! 51: ! 52: /* set breakpoint */ ! 53: case 'b': case 'B': ! 54: IF (bkptr=scanbkpt(dot)) ! 55: THEN bkptr->flag=0; ! 56: FI ! 57: FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt ! 58: DO IF bkptr->flag == 0 ! 59: THEN break; ! 60: FI ! 61: OD ! 62: IF bkptr==0 ! 63: THEN IF (bkptr=sbrk(sizeof *bkptr)) == -1 ! 64: THEN error(SZBKPT); ! 65: ELSE bkptr->nxtbkpt=bkpthead; ! 66: bkpthead=bkptr; ! 67: FI ! 68: FI ! 69: bkptr->loc = dot; ! 70: bkptr->initcnt = bkptr->count = cntval; ! 71: bkptr->flag = BKPTSET; ! 72: check=MAXCOM-1; comptr=bkptr->comm; rdc(); lp--; ! 73: REP *comptr++ = readchar(); ! 74: PER check-- ANDF lastc!=EOR DONE ! 75: *comptr=0; lp--; ! 76: IF check ! 77: THEN return; ! 78: ELSE error(EXBKPT); ! 79: FI ! 80: ! 81: /* exit */ ! 82: case 'k' :case 'K': ! 83: IF pid ! 84: THEN printf("%d: killed", pid); endpcs(); return; ! 85: FI ! 86: error(NOPCS); ! 87: ! 88: /* run program */ ! 89: case 'r': case 'R': ! 90: endpcs(); ! 91: setup(); runmode=CONTIN; ! 92: break; ! 93: ! 94: /* single step */ ! 95: case 's': case 'S': ! 96: IF pid ! 97: THEN ! 98: runmode=SINGLE; execsig=getsig(signo); ! 99: ELSE setup(); loopcnt--; ! 100: FI ! 101: break; ! 102: ! 103: /* continue with optional signal */ ! 104: case 'c': case 'C': case 0: ! 105: IF pid==0 THEN error(NOPCS); FI ! 106: runmode=CONTIN; execsig=getsig(signo); ! 107: break; ! 108: ! 109: default: error(BADMOD); ! 110: } ! 111: ! 112: IF loopcnt>0 ANDF runpcs(runmode,execsig) ! 113: THEN printf("breakpoint%16t"); ! 114: ELSE printf("stopped at%16t"); ! 115: FI ! 116: delbp(); ! 117: printpc(); ! 118: } ! 119:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.