}
counter = 0;
- name = gostring((byte*)"panic");
for(;;){
callpc = pc;
if((uint8*)retfromnewstack == pc) {
continue;
}
f = findfunc((uint64)callpc);
- if(f == nil)
+ if(f == nil) {
+ printf("%p unknown pc\n", callpc);
return;
+ }
name = f->name;
- sp += f->frame;
+ if(f->frame < 8) // assembly funcs say 0 but lie
+ sp += 8;
+ else
+ sp += f->frame;
if(counter++ > 100){
prints("stack trace terminated\n");
break;
if((pc = ((uint8**)sp)[-1]) <= (uint8*)0x1000)
break;
- /* print this frame */
- prints("0x");
- sys·printpointer(callpc - 1); // -1 to get to CALL instr.
- prints("?zi ");
- sys·printstring(f->src);
- prints(":");
- sys·printint(funcline(f, (uint64)callpc-1)); // -1 to get to CALL instr.
- prints("\n");
- prints("\t");
- sys·printstring(name);
- prints("(");
- for(i = 0; i < 3; i++){
- if(i != 0)
- prints(", ");
- sys·printint(((uint32*)sp)[i]);
- }
- prints(", ...)\n");
- prints("\t");
- sys·printstring(name);
- prints("(");
- for(i = 0; i < 3; i++){
+ // print this frame
+ // main+0xf /home/rsc/go/src/runtime/x.go:23
+ // main(0x1, 0x2, 0x3)
+ printf("%S", name);
+ if((uint64)callpc > f->entry)
+ printf("+%X", (uint64)callpc - f->entry);
+ printf(" %S:%d\n", f->src, funcline(f, (uint64)callpc-1)); // -1 to get to CALL instr.
+ printf("\t%S(", name);
+ for(i = 0; i < f->args; i++) {
if(i != 0)
prints(", ");
- prints("0x");
- sys·printpointer(((void**)sp)[i]);
+ sys·printhex(((uint32*)sp)[i]);
+ if(i >= 4) {
+ prints(", ...");
+ break;
+ }
}
- prints(", ...)\n");
+ prints(")\n");
}
}
if(nfunc > 0 && func != nil)
func[nfunc-1].frame = sym->value;
break;
+ case 'p':
+ if(nfunc > 0 && func != nil) {
+ f = &func[nfunc-1];
+ // args counts 32-bit words.
+ // sym->value is the arg's offset.
+ // don't know width of this arg, so assume it is 64 bits.
+ if(f->args < sym->value/4 + 2)
+ f->args = sym->value/4 + 2;
+ }
+ break;
case 'f':
if(fname == nil) {
if(sym->value >= nfname)