pcs.c (2903B)
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 ulong 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 if(pc2line(dbrget(cormap, mach->pc), &line) < 0) 106 error("%r"); 107 n = loopcnt; 108 dprint("%s: running\n", symfil); 109 flush(); 110 for (loopcnt = 1; n > 0; loopcnt = 1) { 111 r = runpcs(SINGLE, keepnote); 112 if(pc2line(dot, &curr) < 0) 113 error("%r"); 114 if (line != curr) { /* on a new line of c */ 115 line = curr; 116 n--; 117 } 118 } 119 loopcnt = 0; 120 break; 121 /* continue with optional note */ 122 case 'c': 123 case 'C': 124 if (pid==0) 125 error(NOPCS); 126 runmode=CONTIN; 127 keepnote=defval(1); 128 break; 129 130 case 'n': /* deal with notes */ 131 if (pid==0) 132 error(NOPCS); 133 n=defval(-1); 134 if(n>=0 && n<nnote){ 135 nnote--; 136 memmove(note[n], note[n+1], (nnote-n)*sizeof(note[0])); 137 } 138 notes(); 139 return; 140 141 case 'h': /* halt the current process */ 142 if (adrflg && adrval == 0) { 143 if (pid == 0) 144 error(NOPCS); 145 ungrab(); 146 } 147 else { 148 grab(); 149 dprint("stopped at%16t"); 150 goto Return; 151 } 152 return; 153 154 case 'x': /* continue executing the current process */ 155 if (pid == 0) 156 error(NOPCS); 157 ungrab(); 158 return; 159 160 default: 161 error("bad `:' command"); 162 } 163 164 if (loopcnt>0) { 165 dprint("%s: running\n", symfil); 166 flush(); 167 r = runpcs(runmode,keepnote); 168 } 169 if (r) 170 dprint("breakpoint%16t"); 171 else 172 dprint("stopped at%16t"); 173 Return: 174 delbp(); 175 printpc(); 176 notes(); 177 }