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