mirror of
https://github.com/golang/go
synced 2024-11-25 08:57:58 -07:00
runtime: print signal information during panic
$ 6.out panic: runtime error: invalid memory address or nil pointer dereference [signal 11 code=0x1 addr=0x0 pc=0x1c16] runtime.panic+0xa7 /Users/rsc/g/go/src/pkg/runtime/proc.c:1089 runtime.panic(0xf6c8, 0x25c010) runtime.panicstring+0x69 /Users/rsc/g/go/src/pkg/runtime/runtime.c:88 runtime.panicstring(0x24814, 0x0) runtime.sigpanic+0x144 /Users/rsc/g/go/src/pkg/runtime/darwin/thread.c:465 runtime.sigpanic() main.f+0x16 /Users/rsc/x.go:5 main.f() main.main+0x1c /Users/rsc/x.go:9 main.main() runtime.mainstart+0xf /Users/rsc/g/go/src/pkg/runtime/amd64/asm.s:77 runtime.mainstart() runtime.goexit /Users/rsc/g/go/src/pkg/runtime/proc.c:149 runtime.goexit() R=r CC=golang-dev https://golang.org/cl/4036042
This commit is contained in:
parent
eaade07d63
commit
12307008e9
@ -66,6 +66,7 @@ runtime·sighandler(int32 sig, Siginfo *info, void *context)
|
|||||||
gp->sig = sig;
|
gp->sig = sig;
|
||||||
gp->sigcode0 = info->si_code;
|
gp->sigcode0 = info->si_code;
|
||||||
gp->sigcode1 = (uintptr)info->si_addr;
|
gp->sigcode1 = (uintptr)info->si_addr;
|
||||||
|
gp->sigpc = r->eip;
|
||||||
|
|
||||||
// Only push runtime·sigpanic if r->eip != 0.
|
// Only push runtime·sigpanic if r->eip != 0.
|
||||||
// If r->eip == 0, probably panicked because of a
|
// If r->eip == 0, probably panicked because of a
|
||||||
|
@ -76,6 +76,7 @@ runtime·sighandler(int32 sig, Siginfo *info, void *context)
|
|||||||
gp->sig = sig;
|
gp->sig = sig;
|
||||||
gp->sigcode0 = info->si_code;
|
gp->sigcode0 = info->si_code;
|
||||||
gp->sigcode1 = (uintptr)info->si_addr;
|
gp->sigcode1 = (uintptr)info->si_addr;
|
||||||
|
gp->sigpc = r->rip;
|
||||||
|
|
||||||
// Only push runtime·sigpanic if r->rip != 0.
|
// Only push runtime·sigpanic if r->rip != 0.
|
||||||
// If r->rip == 0, probably panicked because of a
|
// If r->rip == 0, probably panicked because of a
|
||||||
|
@ -63,6 +63,7 @@ runtime·sighandler(int32 sig, Siginfo* info, void* context)
|
|||||||
gp->sig = sig;
|
gp->sig = sig;
|
||||||
gp->sigcode0 = info->si_code;
|
gp->sigcode0 = info->si_code;
|
||||||
gp->sigcode1 = (uintptr)info->si_addr;
|
gp->sigcode1 = (uintptr)info->si_addr;
|
||||||
|
gp->sigpc = r->mc_eip;
|
||||||
|
|
||||||
// Only push runtime·sigpanic if r->mc_eip != 0.
|
// Only push runtime·sigpanic if r->mc_eip != 0.
|
||||||
// If r->mc_eip == 0, probably panicked because of a
|
// If r->mc_eip == 0, probably panicked because of a
|
||||||
|
@ -71,6 +71,7 @@ runtime·sighandler(int32 sig, Siginfo* info, void* context)
|
|||||||
gp->sig = sig;
|
gp->sig = sig;
|
||||||
gp->sigcode0 = info->si_code;
|
gp->sigcode0 = info->si_code;
|
||||||
gp->sigcode1 = (uintptr)info->si_addr;
|
gp->sigcode1 = (uintptr)info->si_addr;
|
||||||
|
gp->sigpc = r->mc_rip;
|
||||||
|
|
||||||
// Only push runtime·sigpanic if r->mc_rip != 0.
|
// Only push runtime·sigpanic if r->mc_rip != 0.
|
||||||
// If r->mc_rip == 0, probably panicked because of a
|
// If r->mc_rip == 0, probably panicked because of a
|
||||||
|
@ -60,6 +60,7 @@ runtime·sighandler(int32 sig, Siginfo* info, void* context)
|
|||||||
gp->sig = sig;
|
gp->sig = sig;
|
||||||
gp->sigcode0 = info->si_code;
|
gp->sigcode0 = info->si_code;
|
||||||
gp->sigcode1 = ((uintptr*)info)[3];
|
gp->sigcode1 = ((uintptr*)info)[3];
|
||||||
|
gp->sigpc = r->eip;
|
||||||
|
|
||||||
// Only push runtime·sigpanic if r->eip != 0.
|
// Only push runtime·sigpanic if r->eip != 0.
|
||||||
// If r->eip == 0, probably panicked because of a
|
// If r->eip == 0, probably panicked because of a
|
||||||
|
@ -70,6 +70,7 @@ runtime·sighandler(int32 sig, Siginfo* info, void* context)
|
|||||||
gp->sig = sig;
|
gp->sig = sig;
|
||||||
gp->sigcode0 = info->si_code;
|
gp->sigcode0 = info->si_code;
|
||||||
gp->sigcode1 = ((uintptr*)info)[2];
|
gp->sigcode1 = ((uintptr*)info)[2];
|
||||||
|
gp->sigpc = r->rip;
|
||||||
|
|
||||||
// Only push runtime·sigpanic if r->rip != 0.
|
// Only push runtime·sigpanic if r->rip != 0.
|
||||||
// If r->rip == 0, probably panicked because of a
|
// If r->rip == 0, probably panicked because of a
|
||||||
|
@ -67,6 +67,7 @@ runtime·sighandler(int32 sig, Siginfo *info, void *context)
|
|||||||
gp->sig = sig;
|
gp->sig = sig;
|
||||||
gp->sigcode0 = info->si_code;
|
gp->sigcode0 = info->si_code;
|
||||||
gp->sigcode1 = r->fault_address;
|
gp->sigcode1 = r->fault_address;
|
||||||
|
gp->sigpc = r->arm_pc;
|
||||||
|
|
||||||
// If this is a leaf function, we do smash LR,
|
// If this is a leaf function, we do smash LR,
|
||||||
// but we're not going back there anyway.
|
// but we're not going back there anyway.
|
||||||
|
@ -1070,6 +1070,8 @@ runtime·panic(Eface e)
|
|||||||
reflect·call(d->fn, d->args, d->siz);
|
reflect·call(d->fn, d->args, d->siz);
|
||||||
if(p->recovered) {
|
if(p->recovered) {
|
||||||
g->panic = p->link;
|
g->panic = p->link;
|
||||||
|
if(g->panic == nil) // must be done with signal
|
||||||
|
g->sig = 0;
|
||||||
runtime·free(p);
|
runtime·free(p);
|
||||||
// put recovering defer back on list
|
// put recovering defer back on list
|
||||||
// for scheduler to find.
|
// for scheduler to find.
|
||||||
|
@ -30,11 +30,16 @@ runtime·dopanic(int32 unused)
|
|||||||
}
|
}
|
||||||
runtime·panicking++;
|
runtime·panicking++;
|
||||||
|
|
||||||
runtime·printf("\npanic PC=%X\n", (uint64)(uintptr)&unused);
|
if(g->sig != 0)
|
||||||
|
runtime·printf("\n[signal %d code=%p addr=%p pc=%p]\n",
|
||||||
|
g->sig, g->sigcode0, g->sigcode1, g->sigpc);
|
||||||
|
|
||||||
|
runtime·printf("\n");
|
||||||
if(runtime·gotraceback()){
|
if(runtime·gotraceback()){
|
||||||
runtime·traceback(runtime·getcallerpc(&unused), runtime·getcallersp(&unused), 0, g);
|
runtime·traceback(runtime·getcallerpc(&unused), runtime·getcallersp(&unused), 0, g);
|
||||||
runtime·tracebackothers(g);
|
runtime·tracebackothers(g);
|
||||||
}
|
}
|
||||||
|
|
||||||
runtime·breakpoint(); // so we can grab it in a debugger
|
runtime·breakpoint(); // so we can grab it in a debugger
|
||||||
runtime·exit(2);
|
runtime·exit(2);
|
||||||
}
|
}
|
||||||
|
@ -199,6 +199,7 @@ struct G
|
|||||||
int32 sig;
|
int32 sig;
|
||||||
uintptr sigcode0;
|
uintptr sigcode0;
|
||||||
uintptr sigcode1;
|
uintptr sigcode1;
|
||||||
|
uintptr sigpc;
|
||||||
};
|
};
|
||||||
struct M
|
struct M
|
||||||
{
|
{
|
||||||
|
@ -4,22 +4,18 @@
|
|||||||
=========== ./cmp2.go
|
=========== ./cmp2.go
|
||||||
panic: runtime error: comparing uncomparable type []int
|
panic: runtime error: comparing uncomparable type []int
|
||||||
|
|
||||||
panic PC=xxx
|
|
||||||
|
|
||||||
=========== ./cmp3.go
|
=========== ./cmp3.go
|
||||||
panic: runtime error: comparing uncomparable type []int
|
panic: runtime error: comparing uncomparable type []int
|
||||||
|
|
||||||
panic PC=xxx
|
|
||||||
|
|
||||||
=========== ./cmp4.go
|
=========== ./cmp4.go
|
||||||
panic: runtime error: hash of unhashable type []int
|
panic: runtime error: hash of unhashable type []int
|
||||||
|
|
||||||
panic PC=xxx
|
|
||||||
|
|
||||||
=========== ./cmp5.go
|
=========== ./cmp5.go
|
||||||
panic: runtime error: hash of unhashable type []int
|
panic: runtime error: hash of unhashable type []int
|
||||||
|
|
||||||
panic PC=xxx
|
|
||||||
|
|
||||||
=========== ./deferprint.go
|
=========== ./deferprint.go
|
||||||
printing: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
printing: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
||||||
@ -117,12 +113,10 @@ PASS
|
|||||||
=========== interface/fail.go
|
=========== interface/fail.go
|
||||||
panic: interface conversion: *main.S is not main.I: missing method Foo
|
panic: interface conversion: *main.S is not main.I: missing method Foo
|
||||||
|
|
||||||
panic PC=xxx
|
|
||||||
|
|
||||||
=========== interface/returntype.go
|
=========== interface/returntype.go
|
||||||
panic: interface conversion: *main.S is not main.I2: missing method Name
|
panic: interface conversion: *main.S is not main.I2: missing method Name
|
||||||
|
|
||||||
panic PC=xxx
|
|
||||||
|
|
||||||
== nilptr/
|
== nilptr/
|
||||||
|
|
||||||
@ -164,12 +158,10 @@ M
|
|||||||
=========== fixedbugs/bug113.go
|
=========== fixedbugs/bug113.go
|
||||||
panic: interface conversion: interface is int, not int32
|
panic: interface conversion: interface is int, not int32
|
||||||
|
|
||||||
panic PC=xxx
|
|
||||||
|
|
||||||
=========== fixedbugs/bug148.go
|
=========== fixedbugs/bug148.go
|
||||||
2 3
|
2 3
|
||||||
panic: interface conversion: interface is main.T, not main.T
|
panic: interface conversion: interface is main.T, not main.T
|
||||||
|
|
||||||
panic PC=xxx
|
|
||||||
|
|
||||||
== bugs/
|
== bugs/
|
||||||
|
Loading…
Reference in New Issue
Block a user