|
|
1.1 ! root 1: # ! 2: /* ! 3: * ! 4: * UNIX debugger ! 5: * ! 6: */ ! 7: ! 8: #include "defs.h" ! 9: ! 10: MSG NOBKPT; ! 11: MSG SZBKPT; ! 12: MSG EXBKPT; ! 13: MSG NOPCS; ! 14: MSG BADMOD; ! 15: ! 16: /* breakpoints */ ! 17: BKPT *bkpthead; ! 18: ! 19: char lastc; ! 20: ! 21: /* sub process control */ ! 22: ! 23: subpcs(modif) ! 24: { ! 25: register int check; ! 26: int keepsig,runmode; ! 27: register BKPT *bk; ! 28: char *comptr; ! 29: char *malloc(); ! 30: WORD defval(); ! 31: ! 32: keepsig=0; ! 33: loopcnt=cntval; ! 34: switch (modif) { ! 35: ! 36: /* delete breakpoint */ ! 37: case 'd': ! 38: case 'D': ! 39: if ((bk=scanbkpt(dot)) == NULL) ! 40: error(NOBKPT); ! 41: bk->flag=BKPTCLR; ! 42: return; ! 43: ! 44: /* set breakpoint */ ! 45: case 'b': ! 46: case 'B': ! 47: if (bk=scanbkpt(dot)) ! 48: bk->flag=BKPTCLR; ! 49: for (bk=bkpthead; bk; bk=bk->nxtbkpt) ! 50: if (bk->flag == BKPTCLR) ! 51: break; ! 52: if (bk==0) { ! 53: bk = (BKPT *)malloc(sizeof(*bk)); ! 54: if (bk == NULL) ! 55: error(SZBKPT); ! 56: bk->nxtbkpt=bkpthead; ! 57: bkpthead=bk; ! 58: } ! 59: bk->loc = dot; ! 60: bk->initcnt = bk->count = cntval; ! 61: bk->flag = BKPTSET; ! 62: check=MAXCOM-1; ! 63: comptr=bk->comm; ! 64: rdc(); ! 65: reread(); ! 66: do { ! 67: *comptr++ = readchar(); ! 68: } while (check-- && lastc!=EOR); ! 69: *comptr=0; ! 70: reread(); ! 71: if (check) ! 72: return; ! 73: error(EXBKPT); ! 74: ! 75: /* exit */ ! 76: case 'k' : ! 77: case 'K': ! 78: if (pid == 0) ! 79: error(NOPCS); ! 80: printf("%d: killed", pid); ! 81: endpcs(); ! 82: return; ! 83: ! 84: /* run program */ ! 85: case 'r': ! 86: case 'R': ! 87: endpcs(); ! 88: setup(); ! 89: runmode=CONTIN; ! 90: break; ! 91: ! 92: /* single step */ ! 93: case 's': ! 94: case 'S': ! 95: if (pid == 0) { ! 96: setup(); ! 97: loopcnt--; ! 98: } ! 99: else { ! 100: runmode=SINGLE; ! 101: keepsig=defval((WORD)signo); ! 102: } ! 103: break; ! 104: ! 105: /* continue with optional signal */ ! 106: case 'c': ! 107: case 'C': ! 108: case 0: ! 109: if (pid==0) ! 110: error(NOPCS); ! 111: runmode=CONTIN; ! 112: keepsig=defval((WORD)signo); ! 113: break; ! 114: ! 115: case 'g': /* grab the current process */ ! 116: if (adrflg && adrval == 0) { ! 117: if (pid == 0) ! 118: error(NOPCS); ! 119: ungrab(); ! 120: } ! 121: else { ! 122: grab(); ! 123: printf("stopped at%16t"); ! 124: delbp(); ! 125: printpc(); ! 126: } ! 127: return; ! 128: ! 129: default: ! 130: error(BADMOD); ! 131: } ! 132: ! 133: if (loopcnt>0 && runpcs(runmode,keepsig)) ! 134: printf("breakpoint%16t"); ! 135: else ! 136: printf("stopped at%16t"); ! 137: delbp(); ! 138: printpc(); ! 139: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.