1 /* 2 * 3 * debugger 4 * 5 */ 6 7 #include "defs.h" 8 #include "fns.h" 9 10 char NOPCS[] = "no process"; 11 12 /* sub process control */ 13 14 void 15 subpcs(int modif) 16 { 17 int check; 18 int runmode; 19 int keepnote; 20 int n, r; 21 long line, curr; 22 BKPT *bk; 23 char *comptr; 24 25 runmode=SINGLE; 26 r = 0; 27 keepnote=0; 28 loopcnt=cntval; 29 switch (modif) { 30 31 /* delete breakpoint */ 32 case 'd': 33 case 'D': 34 if ((bk=scanbkpt(dot)) == 0) 35 error("no breakpoint set"); 36 bk->flag=BKPTCLR; 37 return; 38 39 /* set breakpoint */ 40 case 'b': 41 case 'B': 42 if (bk=scanbkpt(dot)) 43 bk->flag=BKPTCLR; 44 for (bk=bkpthead; bk; bk=bk->nxtbkpt) 45 if (bk->flag == BKPTCLR) 46 break; 47 if (bk==0) { 48 bk = (BKPT *)malloc(sizeof(*bk)); 49 if (bk == 0) 50 error("too many breakpoints"); 51 bk->nxtbkpt=bkpthead; 52 bkpthead=bk; 53 } 54 bk->loc = dot; 55 bk->initcnt = bk->count = cntval; 56 bk->flag = modif == 'b' ? BKPTSET : BKPTTMP; 57 check=MAXCOM-1; 58 comptr=bk->comm; 59 rdc(); 60 reread(); 61 do { 62 *comptr++ = readchar(); 63 } while (check-- && lastc!=EOR); 64 *comptr=0; 65 if(bk->comm[0] != EOR && cntflg == FALSE) 66 bk->initcnt = bk->count = HUGEINT; 67 reread(); 68 if (check) 69 return; 70 error("bkpt command too long"); 71 72 /* exit */ 73 case 'k' : 74 case 'K': 75 if (pid == 0) 76 error(NOPCS); 77 dprint("%d: killed", pid); 78 pcsactive = 1; /* force 'kill' ctl */ 79 endpcs(); 80 return; 81 82 /* run program */ 83 case 'r': 84 case 'R': 85 endpcs(); 86 setup(); 87 runmode = CONTIN; 88 break; 89 90 /* single step */ 91 case 's': 92 if (pid == 0) { 93 setup(); 94 loopcnt--; 95 } 96 runmode=SINGLE; 97 keepnote=defval(1); 98 break; 99 case 'S': 100 if (pid == 0) { 101 setup(); 102 loopcnt--; 103 } 104 keepnote=defval(1); 105 line = pc2line(rget(cormap, mach->pc)); 106 n = loopcnt; 107 dprint("%s: running\n", symfil); 108 flush(); 109 for (loopcnt = 1; n > 0; loopcnt = 1) { 110 r = runpcs(SINGLE, keepnote); 111 curr = pc2line(dot); 112 if (line != curr) { /* on a new line of c */ 113 line = curr; 114 n--; 115 } 116 } 117 loopcnt = 0; 118 break; 119 /* continue with optional note */ 120 case 'c': 121 case 'C': 122 if (pid==0) 123 error(NOPCS); 124 runmode=CONTIN; 125 keepnote=defval(1); 126 break; 127 128 case 'n': /* deal with notes */ 129 if (pid==0) 130 error(NOPCS); 131 n=defval(-1); 132 if(n>=0 && n<nnote){ 133 nnote--; 134 memmove(note[n], note[n+1], (nnote-n)*sizeof(note[0])); 135 } 136 notes(); 137 return; 138 139 case 'h': /* halt the current process */ 140 if (adrflg && adrval == 0) { 141 if (pid == 0) 142 error(NOPCS); 143 ungrab(); 144 } 145 else { 146 grab(); 147 dprint("stopped at%16t"); 148 goto Return; 149 } 150 return; 151 152 case 'x': /* continue executing the current process */ 153 if (pid == 0) 154 error(NOPCS); 155 ungrab(); 156 return; 157 158 default: 159 error("bad `:' command"); 160 } 161 162 if (loopcnt>0) { 163 dprint("%s: running\n", symfil); 164 flush(); 165 r = runpcs(runmode,keepnote); 166 } 167 if (r) 168 dprint("breakpoint%16t"); 169 else 170 dprint("stopped at%16t"); 171 Return: 172 delbp(); 173 printpc(); 174 notes(); 175 } 176