Blob
1 /*2 *3 * debugger4 *5 */7 #include "defs.h"8 #include "fns.h"10 BKPT *bkpthead;12 BOOL bpin;14 int pid;15 int nnote;16 int ending;17 char note[NNOTE][ERRMAX];19 /* service routines for sub process control */21 int22 runpcs(int runmode, int keepnote)23 {24 int rc;25 BKPT *bkpt;26 ADDR x;28 rc = 0;29 if (adrflg)30 rput(correg, mach->pc, dot);31 if(rget(correg, mach->pc, &dot) < 0)32 error("%r");33 flush();34 while (--loopcnt >= 0) {35 if(loopcnt != 0)36 printpc();37 if (runmode == SINGLE) {38 bkpt = scanbkpt(dot);39 if (bkpt) {40 switch(bkpt->flag){41 case BKPTTMP:42 bkpt->flag = BKPTCLR;43 break;44 case BKPTSKIP:45 bkpt->flag = BKPTSET;46 break;47 }48 }49 runstep(dot, keepnote);50 } else {51 if(rget(correg, mach->pc, &x) < 0)52 error("%r");53 if ((bkpt = scanbkpt(x)) != 0) {54 execbkpt(bkpt, keepnote);55 keepnote = 0;56 }57 setbp();58 runrun(keepnote);59 }60 keepnote = 0;61 delbp();62 if(rget(correg, mach->pc, &dot) < 0)63 error("%r");64 /* real note? */65 if (nnote > 0) {66 keepnote = 1;67 rc = 0;68 continue;69 }70 bkpt = scanbkpt(dot);71 if(bkpt == 0){72 keepnote = 0;73 rc = 0;74 continue;75 }76 /* breakpoint */77 if (bkpt->flag == BKPTTMP)78 bkpt->flag = BKPTCLR;79 else if (bkpt->flag == BKPTSKIP) {80 execbkpt(bkpt, keepnote);81 keepnote = 0;82 loopcnt++; /* we didn't really stop */83 continue;84 }85 else {86 bkpt->flag = BKPTSKIP;87 --bkpt->count;88 if ((bkpt->comm[0] == EOR || command(bkpt->comm, ':') != 0)89 && bkpt->count != 0) {90 execbkpt(bkpt, keepnote);91 keepnote = 0;92 loopcnt++;93 continue;94 }95 bkpt->count = bkpt->initcnt;96 }97 rc = 1;98 }99 return(rc);100 }102 /*103 * finish the process off;104 * kill if still running105 */107 void108 endpcs(void)109 {110 BKPT *bk;112 if(ending)113 return;114 ending = 1;115 if (pid) {116 if(pcsactive){117 killpcs();118 pcsactive = 0;119 }120 pid=0;121 nnote=0;122 for (bk=bkpthead; bk; bk = bk->nxtbkpt)123 if (bk->flag == BKPTTMP)124 bk->flag = BKPTCLR;125 else if (bk->flag != BKPTCLR)126 bk->flag = BKPTSET;127 }128 bpin = FALSE;129 ending = 0;130 }132 /*133 * start up the program to be debugged in a child134 */136 void137 setup(void)138 {140 nnote = 0;141 startpcs();142 bpin = FALSE;143 pcsactive = 1;144 }146 /*147 * skip over a breakpoint:148 * remove breakpoints, then single step149 * so we can put it back150 */151 void152 execbkpt(BKPT *bk, int keepnote)153 {154 runstep(bk->loc, keepnote);155 bk->flag = BKPTSET;156 }158 /*159 * find the breakpoint at adr, if any160 */162 BKPT *163 scanbkpt(ADDR adr)164 {165 BKPT *bk;167 for (bk = bkpthead; bk; bk = bk->nxtbkpt)168 if (bk->flag != BKPTCLR && bk->loc == adr)169 break;170 return(bk);171 }173 /*174 * remove all breakpoints from the process' address space175 */177 void178 delbp(void)179 {180 BKPT *bk;182 if (bpin == FALSE || pid == 0)183 return;184 for (bk = bkpthead; bk; bk = bk->nxtbkpt)185 if (bk->flag != BKPTCLR)186 bkput(bk, 0);187 bpin = FALSE;188 }190 /*191 * install all the breakpoints192 */194 void195 setbp(void)196 {197 BKPT *bk;199 if (bpin == TRUE || pid == 0)200 return;201 for (bk = bkpthead; bk; bk = bk->nxtbkpt)202 if (bk->flag != BKPTCLR)203 bkput(bk, 1);204 bpin = TRUE;205 }