123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- /*
- *
- * debugger
- *
- */
- #include "defs.h"
- #include "fns.h"
- BKPT *bkpthead;
- BOOL bpin;
- int pid;
- int nnote;
- int ending;
- char note[NNOTE][ERRMAX];
- /* service routines for sub process control */
- runpcs(int runmode, int keepnote)
- {
- int rc;
- BKPT *bkpt;
- rc = 0;
- if (adrflg)
- rput(cormap, mach->pc, dot);
- dot = rget(cormap, mach->pc);
- flush();
- while (loopcnt-- > 0) {
- if(loopcnt != 0)
- printpc();
- if (runmode == SINGLE) {
- bkpt = scanbkpt(dot);
- if (bkpt) {
- switch(bkpt->flag){
- case BKPTTMP:
- bkpt->flag = BKPTCLR;
- break;
- case BKPTSKIP:
- bkpt->flag = BKPTSET;
- break;
- }
- }
- runstep(dot, keepnote);
- } else {
- if ((bkpt = scanbkpt(rget(cormap, mach->pc))) != 0) {
- execbkpt(bkpt, keepnote);
- keepnote = 0;
- }
- setbp();
- runrun(keepnote);
- }
- keepnote = 0;
- delbp();
- dot = rget(cormap, mach->pc);
- /* real note? */
- if (nnote > 0) {
- keepnote = 1;
- rc = 0;
- continue;
- }
- bkpt = scanbkpt(dot);
- if(bkpt == 0){
- keepnote = 0;
- rc = 0;
- continue;
- }
- /* breakpoint */
- if (bkpt->flag == BKPTTMP)
- bkpt->flag = BKPTCLR;
- else if (bkpt->flag == BKPTSKIP) {
- execbkpt(bkpt, keepnote);
- keepnote = 0;
- loopcnt++; /* we didn't really stop */
- continue;
- }
- else {
- bkpt->flag = BKPTSKIP;
- --bkpt->count;
- if ((bkpt->comm[0] == EOR || command(bkpt->comm, ':') != 0)
- && bkpt->count != 0) {
- execbkpt(bkpt, keepnote);
- keepnote = 0;
- loopcnt++;
- continue;
- }
- bkpt->count = bkpt->initcnt;
- }
- rc = 1;
- }
- return(rc);
- }
- /*
- * finish the process off;
- * kill if still running
- */
- void
- endpcs(void)
- {
- BKPT *bk;
- if(ending)
- return;
- ending = 1;
- if (pid) {
- if(pcsactive){
- killpcs();
- pcsactive = 0;
- }
- pid=0;
- nnote=0;
- for (bk=bkpthead; bk; bk = bk->nxtbkpt)
- if (bk->flag == BKPTTMP)
- bk->flag = BKPTCLR;
- else if (bk->flag != BKPTCLR)
- bk->flag = BKPTSET;
- }
- bpin = FALSE;
- ending = 0;
- }
- /*
- * start up the program to be debugged in a child
- */
- void
- setup(void)
- {
- nnote = 0;
- startpcs();
- bpin = FALSE;
- pcsactive = 1;
- }
- /*
- * skip over a breakpoint:
- * remove breakpoints, then single step
- * so we can put it back
- */
- void
- execbkpt(BKPT *bk, int keepnote)
- {
- runstep(bk->loc, keepnote);
- bk->flag = BKPTSET;
- }
- /*
- * find the breakpoint at adr, if any
- */
- BKPT *
- scanbkpt(ADDR adr)
- {
- BKPT *bk;
- for (bk = bkpthead; bk; bk = bk->nxtbkpt)
- if (bk->flag != BKPTCLR && bk->loc == adr)
- break;
- return(bk);
- }
- /*
- * remove all breakpoints from the process' address space
- */
- void
- delbp(void)
- {
- BKPT *bk;
- if (bpin == FALSE || pid == 0)
- return;
- for (bk = bkpthead; bk; bk = bk->nxtbkpt)
- if (bk->flag != BKPTCLR)
- bkput(bk, 0);
- bpin = FALSE;
- }
- /*
- * install all the breakpoints
- */
- void
- setbp(void)
- {
- BKPT *bk;
- if (bpin == TRUE || pid == 0)
- return;
- for (bk = bkpthead; bk; bk = bk->nxtbkpt)
- if (bk->flag != BKPTCLR)
- bkput(bk, 1);
- bpin = TRUE;
- }
|