|
|
1.1 root 1: /*
2: *
3: * UNIX debugger
4: *
5: */
6: #include "defs.h"
7: #include "regs.h"
8: #include "sym.h"
9: #include "bkpt.h"
10: #include "map.h"
11: #include "space.h"
12:
13: extern int infile;
14: extern int outfile;
15: extern int maxpos;
16: extern int radix;
17: extern char lastc;
18: extern int maxargs;
19:
20: static int redirin(), redirout();
21: static char *getfname();
22:
23: /* general printing routines ($) */
24:
25: char *Ipath = INCDIR;
26:
27: printtrace(modif)
28: {
29: int i;
30: register BKPT *bk;
31: register struct sym *sp;
32: int stack;
33: char *fname;
34:
35: if (cntflg==0)
36: cntval = -1;
37: switch (modif) {
38:
39: case '<':
40: if (cntval == 0) {
41: while (readchar() != EOR)
42: ;
43: reread();
44: break;
45: }
46: if (rdc() == '<')
47: stack = 1;
48: else {
49: stack = 0;
50: reread();
51: }
52: fname = getfname();
53: redirin(stack, fname);
54: break;
55:
56: case '>':
57: fname = getfname();
58: redirout(fname);
59: break;
60:
61: case 'p':
62: kmproc();
63: break;
64:
65: case 'k':
66: kmsys();
67: break;
68:
69: case 'd':
70: if (adrflg) {
71: if (adrval != 0
72: && (adrval<2 || adrval>16))
73: error("radix should be between 2 and 16, or 0");
74: radix = adrval;
75: if (radix)
76: printf("radix=%d base ten",radix);
77: else
78: printf("radix=magic");
79: }
80: break;
81:
82: case 'q':
83: case 'Q':
84: done();
85:
86: case 'w':
87: maxpos=(adrflg?adrval:MAXPOS);
88: break;
89:
90: case 'S':
91: printsym();
92: break;
93:
94: case 's':
95: maxoff=(adrflg?adrval:MAXOFF);
96: break;
97:
98: case 'v':
99: for (i=0;i<NVARS;i++) {
100: if (var[i])
101: printf("%-8R >%c\n", var[i],
102: (i<=9 ? '0' : 'a'-10) + i);
103: }
104: break;
105:
106: case 'm':
107: printmap("? map", symmap);
108: printmap("/ map", cormap);
109: break;
110:
111: case 0:
112: case '?':
113: if (pid)
114: printf("pcs id = %d\n",pid);
115: else
116: prints("no process\n");
117: sigprint();
118: flushbuf();
119:
120: case 'r':
121: case 'R':
122: printregs(modif);
123: return;
124:
125: case 'c':
126: case 'C':
127: ctrace(modif);
128: break;
129:
130: case 'a':
131: if (adrflg)
132: maxargs = adrval;
133: else
134: printf("%R$a\n", maxargs);
135: return;
136:
137: /*print externals*/
138: case 'e':
139: for (sp = symtab; sp; sp = sp->y_next) {
140: if (sp->y_type==S_DATA)
141: printf("%s/%12t%R\n", sp->y_name,
142: ltow(lget(sp->y_value,CORF|DATASP)));
143: }
144: break;
145:
146: /*print breakpoints*/
147: case 'b':
148: case 'B':
149: for (bk=bkpthead; bk; bk=bk->nxtbkpt)
150: if (bk->flag) {
151: psymoff((WORD)bk->loc,INSTSP,"");
152: if (bk->count != 1)
153: printf(",%d", bk->count);
154: printf(":%c %s", bk->flag == BKPTTMP ? 'B' : 'b', bk->comm);
155: }
156: break;
157:
158: default:
159: error("bad `$' command");
160: }
161:
162: }
163:
164: static
165: char *
166: getfname()
167: {
168: static char fname[ARB];
169: register char *p;
170:
171: if (rdc() == EOR) {
172: reread();
173: return (NULL);
174: }
175: p = fname;
176: do {
177: *p++ = lastc;
178: if (p >= &fname[ARB-1])
179: error("filename too long");
180: } while (rdc() != EOR);
181: *p = 0;
182: reread();
183: return (fname);
184: }
185:
186: static
187: redirin(stack, file)
188: int stack;
189: char *file;
190: {
191: char pfile[ARB];
192:
193: if (file == NULL) {
194: iclose(-1, 0);
195: return;
196: }
197: iclose(stack, 0);
198: if ((infile = open(file, 0)) < 0) {
199: strcpy(pfile, Ipath);
200: strcat(pfile, "/");
201: strcat(pfile, file);
202: if ((infile = open(pfile, 0)) < 0) {
203: infile = STDIN;
204: error("cannot open");
205: }
206: }
207: if (cntflg)
208: var[9] = cntval;
209: else
210: var[9] = 1;
211: }
212:
213: static
214: redirout(file)
215: char *file;
216: {
217:
218: oclose();
219: if (file == NULL)
220: return;
221: if ((outfile = open(file, 1)) >= 0)
222: lseek(outfile, 0L, 2);
223: else if ((outfile = creat(file, 0666)) < 0) {
224: outfile = STDOUT;
225: error("cannot create");
226: }
227: }
228:
229: printmap(s,mp)
230: char *s;
231: register MAP *mp;
232: {
233: char *maptype();
234:
235: if (mp == symmap)
236: printf("%s%12t`%s'\n", s, fsym < 0 ? "-" : symfil);
237: else if (mp == cormap)
238: printf("%s%12t`%s'\n", s, fcor < 0 ? "-" : corfil);
239: else
240: printf("%s\n", s);
241: for (; mp->flag & MPINUSE; mp++)
242: printf("%-8s %-16R %-16R %-16R\n",
243: maptype(mp->sp), (WORD)mp->b, (WORD)mp->e, (WORD)mp->f);
244: }
245:
246: char *
247: maptype(sp)
248: int sp;
249: {
250:
251: switch (sp & SPTYPE) {
252: case INSTSP:
253: return ("text");
254: case DATASP:
255: return ("data");
256: case UBLKSP:
257: return ("user");
258: default:
259: return ("nonsense");
260: }
261: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.