📄 runpcs.c
字号:
/* * * 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 */voidendpcs(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 */voidsetup(void){ nnote = 0; startpcs(); bpin = FALSE; pcsactive = 1;}/* * skip over a breakpoint: * remove breakpoints, then single step * so we can put it back */voidexecbkpt(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 */voiddelbp(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 */voidsetbp(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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -