]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: print "created by" for running goroutines in traceback
authorDmitriy Vyukov <dvyukov@google.com>
Thu, 1 Aug 2013 15:28:38 +0000 (19:28 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Thu, 1 Aug 2013 15:28:38 +0000 (19:28 +0400)
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

src/pkg/runtime/proc.c
src/pkg/runtime/runtime.h
src/pkg/runtime/traceback_arm.c
src/pkg/runtime/traceback_x86.c

index c3af1efaf309197a86bb50080da55b1b943ee705..79568503b716002dc2ce51cf133d4c135557d4ef 100644 (file)
@@ -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);
        }
 }
index 1935a9a2f5a6e77c8d0d73583285ab081fab8402..cfb4793af5933579e20b223ee31221e6bb616c79 100644 (file)
@@ -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*);
 
index 0c80ec64b510c245bef3bdfc2de082e8b227b3bd..78ec5482dbd5d972bb537a12258877aa6b8341a0 100644 (file)
@@ -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)
index df52051ad27f69e65b81f3a567be348a89a92e2d..7f89b78fde77bf01482559b91a84327296944761 100644 (file)
@@ -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