aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime
diff options
context:
space:
mode:
authorDmitriy Vyukov <dvyukov@google.com>2013-08-01 19:28:38 +0400
committerDmitriy Vyukov <dvyukov@google.com>2013-08-01 19:28:38 +0400
commitc33d49002069e798b33d0de42d3eb5073aef7c0b (patch)
tree3d5b9cf23b1f319ac56c02fb61530db8c03a0a8d /src/pkg/runtime
parent3cbc2716a94e836097f40dd3d7dd7b46f0fbbe50 (diff)
downloadgo-c33d49002069e798b33d0de42d3eb5073aef7c0b.tar.xz
runtime: print "created by" for running goroutines in traceback
This allows to at least determine goroutine "identity". Now it looks like: goroutine 12 [running]: goroutine running on other thread; stack unavailable created by testing.RunTests src/pkg/testing/testing.go:440 +0x88e R=golang-dev, r, rsc CC=golang-dev https://golang.org/cl/12248043
Diffstat (limited to 'src/pkg/runtime')
-rw-r--r--src/pkg/runtime/proc.c5
-rw-r--r--src/pkg/runtime/runtime.h1
-rw-r--r--src/pkg/runtime/traceback_arm.c13
-rw-r--r--src/pkg/runtime/traceback_x86.c15
4 files changed, 19 insertions, 15 deletions
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c
index c3af1efaf3..79568503b7 100644
--- a/src/pkg/runtime/proc.c
+++ b/src/pkg/runtime/proc.c
@@ -267,9 +267,10 @@ runtime·tracebackothers(G *me)
continue;
runtime·printf("\n");
runtime·goroutineheader(gp);
- if(gp->status == Grunning)
+ if(gp->status == Grunning) {
runtime·printf("\tgoroutine running on other thread; stack unavailable\n");
- else
+ runtime·printcreatedby(gp);
+ } else
runtime·traceback(gp->sched.pc, gp->sched.sp, gp->sched.lr, gp);
}
}
diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h
index 1935a9a2f5..cfb4793af5 100644
--- a/src/pkg/runtime/runtime.h
+++ b/src/pkg/runtime/runtime.h
@@ -1039,6 +1039,7 @@ Hchan* runtime·makechan_c(ChanType*, int64);
void runtime·chansend(ChanType*, Hchan*, byte*, bool*, void*);
void runtime·chanrecv(ChanType*, Hchan*, byte*, bool*, bool*);
bool runtime·showframe(Func*, G*);
+void runtime·printcreatedby(G*);
void runtime·ifaceE2I(InterfaceType*, Eface, Iface*);
diff --git a/src/pkg/runtime/traceback_arm.c b/src/pkg/runtime/traceback_arm.c
index 0c80ec64b5..78ec5482db 100644
--- a/src/pkg/runtime/traceback_arm.c
+++ b/src/pkg/runtime/traceback_arm.c
@@ -193,20 +193,21 @@ runtime·gentraceback(uintptr pc0, uintptr sp0, uintptr lr0, G *gp, int32 skip,
return n;
}
-static void
-printcreatedby(G *gp)
+void
+runtime·printcreatedby(G *gp)
{
int32 line;
uintptr pc, tracepc;
Func *f;
String file;
- if((pc = gp->gopc) != 0 && (f = runtime·findfunc(pc)) != nil
- && runtime·showframe(f, gp) && gp->goid != 1) {
+ // Show what created goroutine, except main goroutine (goid 1).
+ if((pc = gp->gopc) != 0 && (f = runtime·findfunc(pc)) != nil &&
+ runtime·showframe(f, gp) && gp->goid != 1) {
runtime·printf("created by %s\n", runtime·funcname(f));
tracepc = pc; // back up to CALL instruction for funcline.
if(pc > f->entry)
- tracepc -= sizeof(uintptr);
+ tracepc -= PCQuantum;
line = runtime·funcline(f, tracepc, &file);
runtime·printf("\t%S:%d", file, line);
if(pc > f->entry)
@@ -229,7 +230,7 @@ runtime·traceback(uintptr pc, uintptr sp, uintptr lr, G *gp)
// If that means we print nothing at all, repeat forcing all frames printed.
if(runtime·gentraceback(pc, sp, lr, gp, 0, nil, 100, nil, nil, false) == 0)
runtime·gentraceback(pc, sp, lr, gp, 0, nil, 100, nil, nil, true);
- printcreatedby(gp);
+ runtime·printcreatedby(gp);
}
// func caller(n int) (pc uintptr, file string, line int, ok bool)
diff --git a/src/pkg/runtime/traceback_x86.c b/src/pkg/runtime/traceback_x86.c
index df52051ad2..7f89b78fde 100644
--- a/src/pkg/runtime/traceback_x86.c
+++ b/src/pkg/runtime/traceback_x86.c
@@ -199,21 +199,22 @@ runtime·gentraceback(uintptr pc0, uintptr sp0, uintptr lr0, G *gp, int32 skip,
return n;
}
-static void
-printcreatedby(G *gp)
+void
+runtime·printcreatedby(G *gp)
{
int32 line;
- String file;
uintptr pc, tracepc;
Func *f;
+ String file;
// Show what created goroutine, except main goroutine (goid 1).
- if((pc = gp->gopc) != 0 && (f = runtime·findfunc(pc)) != nil && gp->goid != 1) {
+ if((pc = gp->gopc) != 0 && (f = runtime·findfunc(pc)) != nil &&
+ runtime·showframe(f, gp) && gp->goid != 1) {
runtime·printf("created by %s\n", runtime·funcname(f));
tracepc = pc; // back up to CALL instruction for funcline.
if(pc > f->entry)
- tracepc--;
- line = runtime·funcline(f, tracepc, &file);
+ tracepc -= PCQuantum;
+ line = runtime·funcline(f, tracepc, &file);
runtime·printf("\t%S:%d", file, line);
if(pc > f->entry)
runtime·printf(" +%p", (uintptr)(pc - f->entry));
@@ -236,7 +237,7 @@ runtime·traceback(uintptr pc, uintptr sp, uintptr lr, G *gp)
// If that means we print nothing at all, repeat forcing all frames printed.
if(runtime·gentraceback(pc, sp, 0, gp, 0, nil, 100, nil, nil, false) == 0)
runtime·gentraceback(pc, sp, 0, gp, 0, nil, 100, nil, nil, true);
- printcreatedby(gp);
+ runtime·printcreatedby(gp);
}
int32