9 #define ptrace dbptrace
15 /* general printing routines ($) */
19 static void printfp(Map*, int);
22 * callback on stack trace
25 ptrace(Map *map, Regs *regs, u64int pc, u64int nextpc, Symbol *sym, int depth)
31 dprint("%s(", sym->name);
32 printparams(sym, regs);
38 dprint(" called from ");
39 symoff(buf, 512, nextpc, CTEXT);
41 /* printsource(nextpc); */
43 if(tracetype == 'C' && sym)
44 printlocals(sym, regs);
48 static ulong *adrregvals;
51 adrrw(Regs *regs, char *name, u64int *val, int isr)
55 if((i = windindex(name)) == -1)
56 return correg->rw(correg, name, val, isr);
61 werrstr("saved registers are immutable");
73 adrregvals = malloc(mach->nwindreg*sizeof(adrregvals[0]));
77 for(i=0; i<mach->nwindreg; i++){
78 if(get4(cormap, adrval+4*i, &x) < 0)
87 printdollar(int modif)
104 while (readchar() != EOR)
116 redirin(stack, fname);
128 /* maybe use this for lwpids?
142 maxpos=(adrflg?adrval:MAXPOS);
150 maxoff=(adrflg?adrval:MAXOFF);
154 printmap("? map", symmap);
155 printmap("/ map", cormap);
161 dprint("pid = %d\n",pid);
163 prints("no process\n");
173 printfp(cormap, modif);
183 if(stacktrace(cormap, correg, ptrace) <= 0)
184 error("no stack frame");
189 for (i = 0; indexsym(i, &s)>=0; i++) {
191 if (s.loc.type==LADDR)
192 if (get4(cormap, s.loc.addr, &u4) > 0)
193 dprint("%s/%12t%#lux\n", s.name, (ulong)u4);
197 /*print breakpoints*/
200 for (bk=bkpthead; bk; bk=bk->nxtbkpt)
202 symoff(buf, 512, (WORD)bk->loc, CTEXT);
205 dprint(",%d", bk->count);
206 dprint(":%c %s", bk->flag == BKPTTMP ? 'B' : 'b', bk->comm);
212 if (machbyname(fname) == 0)
213 dprint("unknown name\n");;
216 error("bad `$' command");
225 static char fname[ARB];
235 if (p >= &fname[ARB-1])
236 error("filename too long");
237 } while (rdc() != EOR);
244 printfp(Map *map, int modif)
251 for (i = 0, rp = mach->reglist; rp->name; rp += ret) {
253 if (!(rp->flags&RFLT))
255 ret = fpformat(map, rp, buf, sizeof(buf), modif);
257 werrstr("Register %s: %r", rp->name);
260 /* double column print */
262 dprint("%40t%-8s%-12s\n", rp->name, buf);
264 dprint("\t%-8s%-12s", rp->name, buf);
270 redirin(int stack, char *file)
279 if ((infile = open(file, 0)) < 0) {
280 strcpy(pfile, Ipath);
283 if ((infile = open(pfile, 0)) < 0) {
285 error("cannot open");
291 printmap(char *s, Map *map)
298 dprint("%s%12t`%s'\n", s, symfil==nil ? "-" : symfil);
299 else if (map == cormap)
300 dprint("%s%12t`%s'\n", s, corfil==nil ? "-" : corfil);
303 for (i = 0; i < map->nseg; i++) {
304 dprint("%s%8t%-16#lux %-16#lux %-16#lux %s\n", map->seg[i].name,
305 map->seg[i].base, map->seg[i].base+map->seg[i].size, map->seg[i].offset,
306 map->seg[i].file ? map->seg[i].file : "");
311 * dump the raw symbol table
319 for (i=0; indexsym(i, &s)>=0; i++){
324 dprint("%8#lux t %s\n", sp->loc.addr, sp->name);
328 dprint("%8#lux T %s\n", sp->loc.addr, sp->name);
337 dprint("%8#lux %c %s\n", sp->loc.addr, sp->type, sp->name);
348 * print the value of dot as file:line
351 printsource(long dot)
355 if (fileline(dot, str, STRINGSZ) >= 0)
365 if(rget(correg, mach->pc, &u) < 0)
369 printsource((long)dot);
371 symoff(buf, sizeof(buf), (long)dot, CTEXT);
373 if (mach->das(cormap, dot, 'i', buf, sizeof(buf)) < 0)
375 dprint("%16t%s\n", buf);
380 printlocals(Symbol *fn, Regs *regs)
386 for (i = 0; indexlsym(fn, i, &s)>=0; i++) {
387 if (s.class != CAUTO)
389 if(lget4(cormap, regs, s.loc, &v) >= 0)
390 dprint("%8t%s.%s/%10t%#lux\n", fn->name, s.name, v);
392 dprint("%8t%s.%s/%10t?\n", fn->name, s.name);
397 printparams(Symbol *fn, Regs *regs)
404 for (i = 0; indexlsym(fn, i, &s)>=0; i++) {
405 if (s.class != CPARAM)
409 if(lget4(cormap, regs, s.loc, &v) >= 0)
410 dprint("%s=%#lux", s.name, v);
412 dprint("%s=?", s.name);