|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "defs.h"
9: #include <signal.h>
10: #include "regs.h"
11:
12: MSG ENDPCS;
13:
14: BKPT *bkpthead;
15:
16: BOOL bpin;
17:
18: int pid;
19: int sigcode, signo;
20:
21: /* service routines for sub process control */
22:
23: runpcs(runmode, keepsig)
24: {
25: register int rc;
26: register BKPT *bkpt;
27:
28: if (adrflg)
29: ; /* something = dot */
30: printf("%s: running\n", symfil);
31: while (--loopcnt >= 0) {
32: rrest();
33: if (runmode == SINGLE)
34: runstep(keepsig);
35: else {
36: if ((bkpt = scanbkpt((ADDR)rtow(rget(PC)))) != NULL) {
37: execbkpt(bkpt, keepsig);
38: keepsig = 0;
39: }
40: setbp();
41: runrun(keepsig);
42: }
43: bpwait();
44: chkerr();
45: keepsig = 0;
46: delbp();
47: if (signo != 0 || (bkpt = scanbkpt((ADDR)rtow(rget(PC)))) == NULL) {
48: keepsig = 1;
49: rc = 0;
50: continue;
51: }
52: /* breakpoint */
53: dot = bkpt->loc;
54: if (bkpt->flag == BKPTSKIP) {
55: execbkpt(bkpt, keepsig);
56: keepsig = 0;
57: loopcnt++; /* we didn't really stop */
58: continue;
59: }
60: bkpt->flag = BKPTSKIP;
61: if (bkpt->comm[0] != EOR
62: && command(bkpt->comm, ':') == 0
63: && --bkpt->count == 0) {
64: execbkpt(bkpt, keepsig);
65: keepsig = 0;
66: loopcnt++;
67: continue;
68: }
69: bkpt->count = bkpt->initcnt;
70: rc = 1;
71: }
72: return(rc);
73: }
74:
75: /*
76: * finish the process off;
77: * kill if still running
78: */
79:
80: endpcs()
81: {
82: register BKPT *bk;
83:
84: if (pid) {
85: killpcs();
86: pid=0;
87: for (bk=bkpthead; bk; bk = bk->nxtbkpt)
88: if (bk->flag != BKPTCLR)
89: bk->flag = BKPTSET;
90: }
91: bpin = FALSE;
92: }
93:
94: /*
95: * start up the program to be debugged in a child
96: */
97:
98: setup()
99: {
100:
101: startpcs();
102: if (errflg) {
103: printf("%s: cannot execute\n", symfil);
104: endpcs();
105: error(0);
106: }
107: bpin = FALSE;
108: }
109:
110: /*
111: * skip over a breakpoint:
112: * remove breakpoints, then single step
113: * so we can put it back
114: */
115: execbkpt(bk, keepsig)
116: BKPT *bk;
117: {
118: runstep(keepsig);
119: bk->flag = BKPTSET;
120: bpwait();
121: chkerr();
122: }
123:
124: /*
125: * find the breakpoint at adr, if any
126: */
127:
128: BKPT *
129: scanbkpt(adr)
130: ADDR adr;
131: {
132: register BKPT *bk;
133:
134: for (bk = bkpthead; bk; bk = bk->nxtbkpt)
135: if (bk->flag != BKPTCLR && bk->loc == adr)
136: break;
137: return(bk);
138: }
139:
140: /*
141: * remove all breakpoints from the process' address space
142: */
143:
144: delbp()
145: {
146: register BKPT *bk;
147:
148: if (bpin == FALSE || pid == 0)
149: return;
150: for (bk = bkpthead; bk; bk = bk->nxtbkpt)
151: if (bk->flag != BKPTCLR)
152: bkput(bk, 0);
153: bpin = FALSE;
154: }
155:
156: /*
157: * install all the breakpoints
158: */
159:
160: setbp()
161: {
162: register BKPT *bk;
163:
164: if (bpin == TRUE || pid == 0)
165: return;
166: for (bk = bkpthead; bk; bk = bk->nxtbkpt)
167: if (bk->flag != BKPTCLR)
168: bkput(bk, 1);
169: bpin = TRUE;
170: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.