|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "defs.h"
9: static char sccsid[] = "%Z%%M% %I% %G%";
10:
11:
12: MSG NOBKPT;
13: MSG SZBKPT;
14: MSG EXBKPT;
15: MSG NOPCS;
16: MSG BADMOD;
17:
18: /* breakpoints */
19: BKPTR bkpthead;
20:
21: CHAR *lp;
22: CHAR lastc;
23:
24: INT signo;
25: L_INT dot;
26: INT pid;
27: L_INT cntval;
28: L_INT loopcnt;
29:
30: L_INT entrypt;
31: INT adrflg;
32:
33:
34:
35: /* sub process control */
36:
37: subpcs(modif)
38: {
39: REG INT check;
40: INT execsig,runmode;
41: REG BKPTR bkptr;
42: STRING comptr;
43: execsig=0; loopcnt=cntval;
44:
45: switch (modif) {
46:
47: /* delete breakpoint */
48: case 'd': case 'D':
49: IF (bkptr=scanbkpt(dot))
50: THEN bkptr->flag=0; return;
51: ELSE error(NOBKPT);
52: FI
53:
54: /* set breakpoint */
55: case 'b': case 'B':
56: IF (bkptr=scanbkpt(dot))
57: THEN bkptr->flag=0;
58: FI
59: FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
60: DO IF bkptr->flag == 0
61: THEN break;
62: FI
63: OD
64: IF bkptr==0
65: THEN IF (bkptr=sbrk(sizeof *bkptr)) == -1
66: THEN error(SZBKPT);
67: ELSE bkptr->nxtbkpt=bkpthead;
68: bkpthead=bkptr;
69: FI
70: FI
71: bkptr->loc = dot;
72: bkptr->initcnt = bkptr->count = cntval;
73: bkptr->flag = BKPTSET;
74: check=MAXCOM-1; comptr=bkptr->comm; rdc(); lp--;
75: REP *comptr++ = readchar();
76: PER check-- ANDF lastc!=EOR DONE
77: *comptr=0; lp--;
78: IF check
79: THEN return;
80: ELSE error(EXBKPT);
81: FI
82:
83: /* exit */
84: case 'k' :case 'K':
85: IF pid
86: THEN printf("%d: killed", pid); endpcs(); return;
87: FI
88: error(NOPCS);
89:
90: /* run program */
91: case 'r': case 'R':
92: endpcs();
93: setup(); runmode=CONTIN;
94: IF adrflg
95: THEN IF !scanbkpt(dot) THEN loopcnt++; FI
96: ELSE IF !scanbkpt(entrypt+2) THEN loopcnt++; FI
97: FI
98: break;
99:
100: /* single step */
101: case 's': case 'S':
102: IF pid
103: THEN
104: runmode=SINGLE; execsig=getsig(signo);
105: ELSE setup(); loopcnt--;
106: FI
107: break;
108:
109: /* continue with optional signal */
110: case 'c': case 'C': case 0:
111: IF pid==0 THEN error(NOPCS); FI
112: runmode=CONTIN; execsig=getsig(signo);
113: break;
114:
115: default: error(BADMOD);
116: }
117:
118: IF loopcnt>0 ANDF runpcs(runmode,execsig)
119: THEN printf("breakpoint%16t");
120: ELSE printf("stopped at%16t");
121: FI
122: delbp();
123: printpc();
124: }
125:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.