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
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c
index c3af1ef..7956850 100644
--- a/src/pkg/runtime/proc.c
+++ b/src/pkg/runtime/proc.c
@@ -267,9 +267,10 @@
 			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 1935a9a..cfb4793 100644
--- a/src/pkg/runtime/runtime.h
+++ b/src/pkg/runtime/runtime.h
@@ -1039,6 +1039,7 @@
 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 0c80ec6..78ec548 100644
--- a/src/pkg/runtime/traceback_arm.c
+++ b/src/pkg/runtime/traceback_arm.c
@@ -193,20 +193,21 @@
 	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 @@
 	// 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 df52051..7f89b78 100644
--- a/src/pkg/runtime/traceback_x86.c
+++ b/src/pkg/runtime/traceback_x86.c
@@ -199,21 +199,22 @@
 	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 @@
 	// 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