|
|
1.1 root 1: static char sccsid[] = "%Z%%M% %I% %G%";
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7: #include "defs.h"
8:
9: MSG LONGFIL;
10: MSG NOTOPEN;
11: MSG A68BAD;
12: MSG A68LNK;
13: MSG BADMOD;
14:
15: MAP txtmap;
16: MAP datmap;
17:
18: ADDR lastframe;
19: ADDR callpc;
20:
21: INT infile;
22: INT outfile;
23: CHAR *lp;
24: L_INT maxoff;
25: L_INT maxpos;
26: INT radix;
27:
28: /* symbol management */
29: L_INT localval;
30:
31: /* breakpoints */
32: BKPTR bkpthead;
33:
34: REGLIST reglist [] = {
35: "p1lr", P1LR,
36: "p1br",P1BR,
37: "p0lr", P0LR,
38: "p0br",P0BR,
39: "ksp",KSP,
40: "esp",ESP,
41: "ssp",SSP,
42: "psl", PSL,
43: "pc", PC,
44: "usp",USP,
45: "fp", FP,
46: "ap", AP,
47: "r11", R11,
48: "r10", R10,
49: "r9", R9,
50: "r8", R8,
51: "r7", R7,
52: "r6", R6,
53: "r5", R5,
54: "r4", R4,
55: "r3", R3,
56: "r2", R2,
57: "r1", R1,
58: "r0", R0,
59: };
60:
61: char lastc;
62:
63: INT fcor;
64: STRING errflg;
65: INT signo;
66:
67:
68: L_INT dot;
69: L_INT var[];
70: STRING symfil;
71: STRING corfil;
72: INT pid;
73: L_INT adrval;
74: INT adrflg;
75: L_INT cntval;
76: INT cntflg;
77:
78: STRING signals[] = {
79: "",
80: "hangup",
81: "interrupt",
82: "quit",
83: "illegal instruction",
84: "trace/BPT",
85: "IOT",
86: "EMT",
87: "floating exception",
88: "killed",
89: "bus error",
90: "memory fault",
91: "bad system call",
92: "broken pipe",
93: "alarm call",
94: "terminated",
95: "signal 16",
96: "stop (signal)",
97: "stop (tty)",
98: "continue (signal)",
99: "child termination",
100: "stop (tty input)",
101: "stop (tty output)",
102: "input available (signal)",
103: "cpu timelimit",
104: "file sizelimit",
105: "signal 26",
106: "signal 27",
107: "signal 28",
108: "signal 29",
109: "signal 30",
110: "signal 31",
111: };
112:
113: /* general printing routines ($) */
114:
115: printtrace(modif)
116: {
117: INT narg, i, stat, name, limit;
118: POS dynam;
119: REG BKPTR bkptr;
120: CHAR hi, lo;
121: ADDR word;
122: STRING comptr;
123: ADDR argp, frame, link;
124: register struct nlist *sp;
125:
126: IF cntflg==0 THEN cntval = -1; FI
127:
128: switch (modif) {
129:
130: case '<':
131: case '>':
132: {CHAR file[64];
133: INT index;
134:
135: index=0;
136: IF modif=='<'
137: THEN iclose();
138: ELSE oclose();
139: FI
140: IF rdc()!=EOR
141: THEN REP file[index++]=lastc;
142: IF index>=63 THEN error(LONGFIL); FI
143: PER readchar()!=EOR DONE
144: file[index]=0;
145: IF modif=='<'
146: THEN infile=open(file,0);
147: IF infile<0
148: THEN infile=0; error(NOTOPEN);
149: FI
150: ELSE outfile=open(file,1);
151: IF outfile<0
152: THEN outfile=creat(file,0644);
153: #ifndef EDDT
154: ELSE lseek(outfile,0L,2);
155: #endif
156: FI
157: FI
158:
159: FI
160: lp--;
161: }
162: break;
163:
164: case 'd':
165: if (adrflg) {
166: if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;}
167: printf("radix=%d base ten",radix=adrval);
168: }
169: break;
170:
171: case 'q': case 'Q': case '%':
172: done();
173:
174: case 'w': case 'W':
175: maxpos=(adrflg?adrval:MAXPOS);
176: break;
177:
178: case 's': case 'S':
179: maxoff=(adrflg?adrval:MAXOFF);
180: break;
181:
182: case 'v': case 'V':
183: prints("variables\n");
184: FOR i=0;i<=35;i++
185: DO IF var[i]
186: THEN printc((i<=9 ? '0' : 'a'-10) + i);
187: printf(" = %Q\n",var[i]);
188: FI
189: OD
190: break;
191:
192: case 'm': case 'M':
193: printmap("? map",&txtmap);
194: printmap("/ map",&datmap);
195: break;
196:
197: case 0: case '?':
198: IF pid
199: THEN printf("pcs id = %d\n",pid);
200: ELSE prints("no process\n");
201: FI
202: sigprint(); flushbuf();
203:
204: case 'r': case 'R':
205: printregs();
206: return;
207:
208: case 'c': case 'C':
209: IF adrflg
210: THEN frame=adrval;
211: word=get(adrval+6,DSP)&0xFFFF;
212: IF word&0x2000
213: THEN /* 'calls', can figure out argp */
214: argp=adrval+20+((word>>14)&3); word &= 0xFFF;
215: WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD
216: ELSE /* 'callg', can't tell where argp is */ argp=frame;
217: FI
218: callpc=get(frame+16,DSP);
219: ELSE argp= *(ADDR *)(((ADDR)&u)+AP);
220: frame= *(ADDR *)(((ADDR)&u)+FP);
221: callpc= *(ADDR *)(((ADDR)&u)+PC);
222: FI
223: lastframe=0;
224: WHILE cntval--
225: DO chkerr();
226: findsym(callpc,ISYM);
227: if (cursym && !strcmp(cursym->n_un.n_name, "start"))
228: break;
229: printf("%s(", cursym ? cursym->n_un.n_name : "?");
230: narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
231: LOOP IF narg==0 THEN break; FI
232: printf("%R", get(argp += 4, DSP));
233: IF --narg!=0 THEN printc(','); FI
234: POOL
235: printf(") from %X\n",callpc); /* jkf mod */
236:
237: IF modif=='C'
238: THEN WHILE localsym(frame,argp)
239: DO word=get(localval,DSP);
240: printf("%8t%s:%10t", cursym->n_un.n_name);
241: IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI
242: OD
243: FI
244:
245: callpc=get(frame+16, DSP);
246: argp=get(frame+8, DSP);
247: lastframe=frame;
248: frame=get(frame+12, DSP)&EVEN;
249: IF frame==0 ORF (!adrflg ANDF !INSTACK(frame))
250: THEN break;
251: FI
252: OD
253: break;
254:
255: /*print externals*/
256: case 'e': case 'E':
257: for (sp = symtab; sp < esymtab; sp++) {
258: if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT))
259: printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP));
260: }
261: break;
262:
263: case 'a': case 'A':
264: error("No algol 68 on VAX");
265: /*NOTREACHED*/
266:
267: /*print breakpoints*/
268: case 'b': case 'B':
269: printf("breakpoints\ncount%8tbkpt%24tcommand\n");
270: for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
271: if (bkptr->flag) {
272: printf("%-8.8d",bkptr->count);
273: psymoff(leng(bkptr->loc),ISYM,"%24t");
274: comptr=bkptr->comm;
275: WHILE *comptr DO printc(*comptr++); OD
276: }
277: break;
278:
279: default: error(BADMOD);
280: }
281:
282: }
283:
284: printmap(s,amap)
285: STRING s; MAP *amap;
286: {
287: int file;
288: file=amap->ufd;
289: printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
290: printf("b1 = %-16R",amap->b1);
291: printf("e1 = %-16R",amap->e1);
292: printf("f1 = %-16R",amap->f1);
293: printf("\nb2 = %-16R",amap->b2);
294: printf("e2 = %-16R",amap->e2);
295: printf("f2 = %-16R",amap->f2);
296: printc(EOR);
297: }
298:
299: printregs()
300: {
301: REG REGPTR p;
302: L_INT v;
303:
304: FOR p=reglist; p < ®list[24]; p++
305: DO printf("%s%6t%R %16t", p->rname, v= *(ADDR *)(((ADDR)&u)+p->roffs));
306: valpr(v,(p->roffs==PC?ISYM:DSYM));
307: printc(EOR);
308: OD
309: printpc();
310: }
311:
312: getreg(regnam)
313: {
314: REG REGPTR p;
315: REG STRING regptr;
316: CHAR *olp;
317: CHAR regnxt;
318:
319: olp=lp;
320: FOR p=reglist; p < ®list[24]; p++
321: DO regptr=p->rname;
322: IF (regnam == *regptr++)
323: THEN
324: WHILE *regptr
325: DO IF (regnxt=readchar()) != *regptr++
326: THEN --regptr; break;
327: FI
328: OD
329: IF *regptr
330: THEN lp=olp;
331: ELSE return(p->roffs);
332: FI
333: FI
334: OD
335: lp=olp;
336: return(0);
337: }
338:
339: printpc()
340: {
341: dot= *(ADDR *)(((ADDR)&u)+PC);
342: psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
343: printc(EOR);
344: }
345:
346: sigprint()
347: {
348: IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0])
349: THEN prints(signals[signo]); FI
350: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.