diff options
| author | Russ Cox <rsc@golang.org> | 2011-08-22 23:26:39 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2011-08-22 23:26:39 -0400 |
| commit | 03e9ea5b74a4138fbaa7278c735cf7300484e1eb (patch) | |
| tree | 6081b5af66d1dd36b0d48c80b80e9ffe1393f1ce /src/pkg/runtime/runtime.h | |
| parent | 45407bd5599299b90e4d060d10993fb456d1d84a (diff) | |
| download | go-03e9ea5b74a4138fbaa7278c735cf7300484e1eb.tar.xz | |
runtime: simplify stack traces
Make the stack traces more readable for new
Go programmers while preserving their utility for old hands.
- Change status number [4] to string.
- Elide frames in runtime package (internal details).
- Swap file:line and arguments.
- Drop 'created by' for main goroutine.
- Show goroutines in order of allocation:
implies main goroutine first if nothing else.
There is no option to get the extra frames back.
Uncomment 'return 1' at the bottom of symtab.c.
$ 6.out
throw: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/Users/rsc/g/go/src/pkg/runtime/x.go:22 +0x8a
goroutine 2 [select (no cases)]:
main.sel()
/Users/rsc/g/go/src/pkg/runtime/x.go:11 +0x18
created by main.main
/Users/rsc/g/go/src/pkg/runtime/x.go:19 +0x23
goroutine 3 [chan receive]:
main.recv(0xf8400010a0, 0x0)
/Users/rsc/g/go/src/pkg/runtime/x.go:15 +0x2e
created by main.main
/Users/rsc/g/go/src/pkg/runtime/x.go:20 +0x50
goroutine 4 [chan receive (nil chan)]:
main.recv(0x0, 0x0)
/Users/rsc/g/go/src/pkg/runtime/x.go:15 +0x2e
created by main.main
/Users/rsc/g/go/src/pkg/runtime/x.go:21 +0x66
$
$ 6.out index
panic: runtime error: index out of range
goroutine 1 [running]:
main.main()
/Users/rsc/g/go/src/pkg/runtime/x.go:25 +0xb9
$
$ 6.out nil
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x22ca]
goroutine 1 [running]:
main.main()
/Users/rsc/g/go/src/pkg/runtime/x.go:28 +0x211
$
$ 6.out panic
panic: panic
goroutine 1 [running]:
main.main()
/Users/rsc/g/go/src/pkg/runtime/x.go:30 +0x101
$
R=golang-dev, qyzhai, n13m3y3r, r
CC=golang-dev
https://golang.org/cl/4907048
Diffstat (limited to 'src/pkg/runtime/runtime.h')
| -rw-r--r-- | src/pkg/runtime/runtime.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h index bea8636a9f..1e52d76ad0 100644 --- a/src/pkg/runtime/runtime.h +++ b/src/pkg/runtime/runtime.h @@ -199,6 +199,7 @@ struct G int16 status; int32 goid; uint32 selgen; // valid sudog pointer + int8* waitreason; // if status==Gwaiting G* schedlink; bool readyonstop; bool ispanic; @@ -384,6 +385,7 @@ struct Panic extern Alg runtime·algarray[Amax]; extern String runtime·emptystring; G* runtime·allg; +G* runtime·lastg; M* runtime·allm; extern int32 runtime·gomaxprocs; extern bool runtime·singleproc; @@ -434,6 +436,7 @@ String runtime·gostringnocopy(byte*); String runtime·gostringw(uint16*); void runtime·initsig(int32); int32 runtime·gotraceback(void); +void runtime·goroutineheader(G*); void runtime·traceback(uint8 *pc, uint8 *sp, uint8 *lr, G* gp); void runtime·tracebackothers(G*); int32 runtime·write(int32, void*, int32); @@ -631,6 +634,7 @@ void runtime·chansend(ChanType*, Hchan*, void*, bool*); void runtime·chanrecv(ChanType*, Hchan*, void*, bool*, bool*); int32 runtime·chanlen(Hchan*); int32 runtime·chancap(Hchan*); +bool runtime·showframe(Func*); void runtime·ifaceE2I(struct InterfaceType*, Eface, Iface*); |
