13 /* general printing routines ($) */
17 static void printfp(Map*, int);
20 * callback on stack trace
23 ptrace(Map *map, uvlong pc, uvlong sp, Symbol *sym)
28 dprint("%s(", sym->name);
31 printsource(sym->value);
32 dprint(" called from ");
33 symoff(buf, 512, pc, CTEXT);
59 while (readchar() != EOR)
71 redirin(stack, fname);
92 maxpos=(adrflg?adrval:MAXPOS);
100 maxoff=(adrflg?adrval:MAXOFF);
104 printmap("? map", symmap);
105 printmap("/ map", cormap);
111 dprint("pid = %d\n",pid);
113 prints("no process\n");
123 printfp(cormap, modif);
129 if (machdata->ctrace) {
132 * trace from jmpbuf for multi-threaded code.
133 * assume sp and pc are in adjacent locations
134 * and mach->szaddr in size.
136 if (geta(cormap, adrval, &sp) < 0 ||
137 geta(cormap, adrval+mach->szaddr, &pc) < 0)
140 sp = rget(cormap, mach->sp);
141 pc = rget(cormap, mach->pc);
144 link = rget(cormap, mach->link);
147 if (machdata->ctrace(cormap, pc, sp, link, ptrace) <= 0)
148 error("no stack frame");
154 for (i = 0; globalsym(&s, i); i++) {
155 if (get4(cormap, s.value, &w) > 0)
156 dprint("%s/%12t%#lux\n", s.name, w);
160 /*print breakpoints*/
163 for (bk=bkpthead; bk; bk=bk->nxtbkpt)
165 symoff(buf, 512, (WORD)bk->loc, CTEXT);
168 dprint(",%d", bk->count);
169 dprint(":%c %S", bk->flag == BKPTTMP ? 'B' : 'b', bk->comm);
175 if (machbyname(fname) == 0)
176 dprint("unknown name\n");;
179 error("bad `$' command");
187 static char fname[ARB];
197 if (p >= &fname[ARB-1])
198 error("filename too long");
199 } while (rdc() != EOR);
206 printfp(Map *map, int modif)
213 for (i = 0, rp = mach->reglist; rp->rname; rp += ret) {
215 if (!(rp->rflags&RFLT))
217 ret = fpformat(map, rp, buf, sizeof(buf), modif);
219 werrstr("Register %s: %r", rp->rname);
222 /* double column print */
224 dprint("%40t%-8s%-12s\n", rp->rname, buf);
226 dprint("\t%-8s%-12s", rp->rname, buf);
232 redirin(int stack, char *file)
241 if ((infile = open(file, 0)) < 0) {
242 pfile = smprint("%s/%s", Ipath, file);
243 infile = open(pfile, 0);
247 error("cannot open");
253 printmap(char *s, Map *map)
260 dprint("%s%12t`%s'\n", s, fsym < 0 ? "-" : symfil);
261 else if (map == cormap)
262 dprint("%s%12t`%s'\n", s, fcor < 0 ? "-" : corfil);
265 for (i = 0; i < map->nsegs; i++) {
266 if (map->seg[i].inuse)
267 dprint("%s%8t%-16#llux %-16#llux %-16#llux\n",
268 map->seg[i].name, map->seg[i].b,
269 map->seg[i].e, map->seg[i].f);
274 * dump the raw symbol table
282 for (i = 0; sp = getsym(i); i++) {
286 dprint("%16#llux t %s\n", sp->value, sp->name);
290 dprint("%16#llux T %s\n", sp->value, sp->name);
299 dprint("%16#llux %c %s\n", sp->value, sp->type, sp->name);
310 * print the value of dot as file:line
313 printsource(ADDR dot)
317 if (fileline(str, STRINGSZ, dot))
326 dot = rget(cormap, mach->pc);
328 printsource((long)dot);
330 symoff(buf, sizeof(buf), (long)dot, CTEXT);
332 if (machdata->das(cormap, dot, 'i', buf, sizeof(buf)) < 0)
334 dprint("%16t%s\n", buf);
339 printlocals(Symbol *fn, ADDR fp)
346 for (i = 0; localsym(&s, i); i++) {
347 if (s.class != CAUTO)
349 if (get4(cormap, fp-s.value, &w) > 0)
350 dprint("%8t%s.%s/%10t%#lux\n", fn->name, s.name, w);
352 dprint("%8t%s.%s/%10t?\n", fn->name, s.name);
357 printparams(Symbol *fn, ADDR fp)
364 fp += mach->szaddr; /* skip saved pc */
366 for (i = 0; localsym(&s, i); i++) {
367 if (s.class != CPARAM)
371 if (get4(cormap, fp+s.value, &w) > 0)
372 dprint("%s=%#lux", s.name, w);