debugger
This commit is contained in:
parent
a84cbb2a17
commit
84114f0665
15 changed files with 3179 additions and 0 deletions
177
src/cmd/db/pcs.c
Normal file
177
src/cmd/db/pcs.c
Normal file
|
|
@ -0,0 +1,177 @@
|
|||
/*
|
||||
*
|
||||
* debugger
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include "fns.h"
|
||||
|
||||
char NOPCS[] = "no process";
|
||||
|
||||
/* sub process control */
|
||||
|
||||
void
|
||||
subpcs(int modif)
|
||||
{
|
||||
int check;
|
||||
int runmode;
|
||||
int keepnote;
|
||||
int n, r;
|
||||
ulong line, curr;
|
||||
BKPT *bk;
|
||||
char *comptr;
|
||||
|
||||
runmode=SINGLE;
|
||||
r = 0;
|
||||
keepnote=0;
|
||||
loopcnt=cntval;
|
||||
switch (modif) {
|
||||
|
||||
/* delete breakpoint */
|
||||
case 'd':
|
||||
case 'D':
|
||||
if ((bk=scanbkpt(dot)) == 0)
|
||||
error("no breakpoint set");
|
||||
bk->flag=BKPTCLR;
|
||||
return;
|
||||
|
||||
/* set breakpoint */
|
||||
case 'b':
|
||||
case 'B':
|
||||
if (bk=scanbkpt(dot))
|
||||
bk->flag=BKPTCLR;
|
||||
for (bk=bkpthead; bk; bk=bk->nxtbkpt)
|
||||
if (bk->flag == BKPTCLR)
|
||||
break;
|
||||
if (bk==0) {
|
||||
bk = (BKPT *)malloc(sizeof(*bk));
|
||||
if (bk == 0)
|
||||
error("too many breakpoints");
|
||||
bk->nxtbkpt=bkpthead;
|
||||
bkpthead=bk;
|
||||
}
|
||||
bk->loc = dot;
|
||||
bk->initcnt = bk->count = cntval;
|
||||
bk->flag = modif == 'b' ? BKPTSET : BKPTTMP;
|
||||
check=MAXCOM-1;
|
||||
comptr=bk->comm;
|
||||
rdc();
|
||||
reread();
|
||||
do {
|
||||
*comptr++ = readchar();
|
||||
} while (check-- && lastc!=EOR);
|
||||
*comptr=0;
|
||||
if(bk->comm[0] != EOR && cntflg == FALSE)
|
||||
bk->initcnt = bk->count = HUGEINT;
|
||||
reread();
|
||||
if (check)
|
||||
return;
|
||||
error("bkpt command too long");
|
||||
|
||||
/* exit */
|
||||
case 'k' :
|
||||
case 'K':
|
||||
if (pid == 0)
|
||||
error(NOPCS);
|
||||
dprint("%d: killed", pid);
|
||||
pcsactive = 1; /* force 'kill' ctl */
|
||||
endpcs();
|
||||
return;
|
||||
|
||||
/* run program */
|
||||
case 'r':
|
||||
case 'R':
|
||||
endpcs();
|
||||
setup();
|
||||
runmode = CONTIN;
|
||||
break;
|
||||
|
||||
/* single step */
|
||||
case 's':
|
||||
if (pid == 0) {
|
||||
setup();
|
||||
loopcnt--;
|
||||
}
|
||||
runmode=SINGLE;
|
||||
keepnote=defval(1);
|
||||
break;
|
||||
case 'S':
|
||||
if (pid == 0) {
|
||||
setup();
|
||||
loopcnt--;
|
||||
}
|
||||
keepnote=defval(1);
|
||||
if(pc2line(dbrget(cormap, mach->pc), &line) < 0)
|
||||
error("%r");
|
||||
n = loopcnt;
|
||||
dprint("%s: running\n", symfil);
|
||||
flush();
|
||||
for (loopcnt = 1; n > 0; loopcnt = 1) {
|
||||
r = runpcs(SINGLE, keepnote);
|
||||
if(pc2line(dot, &curr) < 0)
|
||||
error("%r");
|
||||
if (line != curr) { /* on a new line of c */
|
||||
line = curr;
|
||||
n--;
|
||||
}
|
||||
}
|
||||
loopcnt = 0;
|
||||
break;
|
||||
/* continue with optional note */
|
||||
case 'c':
|
||||
case 'C':
|
||||
if (pid==0)
|
||||
error(NOPCS);
|
||||
runmode=CONTIN;
|
||||
keepnote=defval(1);
|
||||
break;
|
||||
|
||||
case 'n': /* deal with notes */
|
||||
if (pid==0)
|
||||
error(NOPCS);
|
||||
n=defval(-1);
|
||||
if(n>=0 && n<nnote){
|
||||
nnote--;
|
||||
memmove(note[n], note[n+1], (nnote-n)*sizeof(note[0]));
|
||||
}
|
||||
notes();
|
||||
return;
|
||||
|
||||
case 'h': /* halt the current process */
|
||||
if (adrflg && adrval == 0) {
|
||||
if (pid == 0)
|
||||
error(NOPCS);
|
||||
ungrab();
|
||||
}
|
||||
else {
|
||||
grab();
|
||||
dprint("stopped at%16t");
|
||||
goto Return;
|
||||
}
|
||||
return;
|
||||
|
||||
case 'x': /* continue executing the current process */
|
||||
if (pid == 0)
|
||||
error(NOPCS);
|
||||
ungrab();
|
||||
return;
|
||||
|
||||
default:
|
||||
error("bad `:' command");
|
||||
}
|
||||
|
||||
if (loopcnt>0) {
|
||||
dprint("%s: running\n", symfil);
|
||||
flush();
|
||||
r = runpcs(runmode,keepnote);
|
||||
}
|
||||
if (r)
|
||||
dprint("breakpoint%16t");
|
||||
else
|
||||
dprint("stopped at%16t");
|
||||
Return:
|
||||
delbp();
|
||||
printpc();
|
||||
notes();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue