diff options
| author | Russ Cox <rsc@golang.org> | 2011-03-02 13:42:02 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2011-03-02 13:42:02 -0500 |
| commit | 324cc3d0408ff45392590d4f38e199f286d3eb57 (patch) | |
| tree | 1bd7fca1265000ad741270bc9859273891f7a1fc /src/pkg/runtime/proc.c | |
| parent | 9733f96b4798f608ce9ff284ebcd06473c3734a2 (diff) | |
| download | go-324cc3d0408ff45392590d4f38e199f286d3eb57.tar.xz | |
runtime: record goroutine creation pc and display in traceback
package main
func main() {
go func() { *(*int)(nil) = 0 }()
select{}
}
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x1c96]
runtime.panic+0xac /Users/rsc/g/go/src/pkg/runtime/proc.c:1083
runtime.panic(0x11bf0, 0xf8400011f0)
runtime.panicstring+0xa3 /Users/rsc/g/go/src/pkg/runtime/runtime.c:116
runtime.panicstring(0x29a57, 0x0)
runtime.sigpanic+0x144 /Users/rsc/g/go/src/pkg/runtime/darwin/thread.c:470
runtime.sigpanic()
main._func_001+0x16 /Users/rsc/g/go/src/pkg/runtime/x.go:188
main._func_001()
runtime.goexit /Users/rsc/g/go/src/pkg/runtime/proc.c:150
runtime.goexit()
----- goroutine created by -----
main.main+0x3d /Users/rsc/g/go/src/pkg/runtime/x.go:4
goroutine 1 [4]:
runtime.gosched+0x77 /Users/rsc/g/go/src/pkg/runtime/proc.c:598
runtime.gosched()
runtime.block+0x27 /Users/rsc/g/go/src/pkg/runtime/chan.c:680
runtime.block()
main.main+0x44 /Users/rsc/g/go/src/pkg/runtime/x.go:5
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:150
runtime.goexit()
----- goroutine created by -----
_rt0_amd64+0x8e /Users/rsc/g/go/src/pkg/runtime/amd64/asm.s:64
Fixes #1563.
R=r
CC=golang-dev
https://golang.org/cl/4243046
Diffstat (limited to 'src/pkg/runtime/proc.c')
| -rw-r--r-- | src/pkg/runtime/proc.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index ba16f48bbc..db6072b5ce 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -884,11 +884,11 @@ runtime·newproc(int32 siz, byte* fn, ...) argp = (byte*)(&fn+2); // skip caller's saved LR else argp = (byte*)(&fn+1); - runtime·newproc1(fn, argp, siz, 0); + runtime·newproc1(fn, argp, siz, 0, runtime·getcallerpc(&siz)); } G* -runtime·newproc1(byte *fn, byte *argp, int32 narg, int32 nret) +runtime·newproc1(byte *fn, byte *argp, int32 narg, int32 nret, void *callerpc) { byte *sp; G *newg; @@ -926,6 +926,7 @@ runtime·newproc1(byte *fn, byte *argp, int32 narg, int32 nret) newg->sched.pc = (byte*)runtime·goexit; newg->sched.g = newg; newg->entry = fn; + newg->gopc = (uintptr)callerpc; runtime·sched.gcount++; runtime·goidgen++; |
