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