]> Cypherpunks repositories - gostls13.git/commitdiff
print tracebacks for all goroutines, not just the crashing one
authorRob Pike <r@golang.org>
Mon, 28 Jul 2008 18:29:41 +0000 (11:29 -0700)
committerRob Pike <r@golang.org>
Mon, 28 Jul 2008 18:29:41 +0000 (11:29 -0700)
R=ken
OCL=13518
CL=13518

src/runtime/proc.c
src/runtime/rt1_amd64_darwin.c
src/runtime/rt1_amd64_linux.c
src/runtime/runtime.c
src/runtime/runtime.h

index ecd4cedab047e7bb2fc4fe138881847170f09fba..bef497c9a7252b38b9bf3594c555c914ae2aff4a 100644 (file)
@@ -74,6 +74,21 @@ sys·newproc(int32 siz, byte* fn, byte* arg0)
 //prints("\n");
 }
 
+void
+tracebackothers(G *me)
+{
+       G *g;
+
+       for(g = allg; g != nil; g = g->alllink) {
+               if(g == me)
+                       continue;
+               prints("\ngoroutine ");
+               sys·printint(g->goid);
+               prints(":\n");
+               traceback(g->sched.PC, g->sched.SP+8, g);  // gogo adjusts SP by 8 (not portable!)
+       }
+}
+
 G*
 select(void)
 {
index 9d03ce05590f85663c8ee0d2f29b6122c4f1e7be..e0d2cb8b776ae054858b7e5d7504ef393b7cf553 100644 (file)
@@ -149,6 +149,7 @@ sighandler(int32 sig, siginfo *info, void *context)
        prints("\n\n");
         
        traceback((void *)ss->__rip, (void *)ss->__rsp, (void*)ss->__r15);
+       tracebackothers((void*)ss->__r15);
        print_thread_state(ss);
         
        sys·exit(2);
index b31b89aa68ebeaf4ac7eef4535c5eaf4e4ff29ce..9f3d99e6ef114ec5ee815a7c3d800051a3759bd2 100644 (file)
@@ -153,7 +153,8 @@ sighandler(int32 sig, siginfo* info, void** context)
         prints("\n\n");
         
        traceback((void *)sc->rip, (void *)sc->rsp, (void *)sc->r15);
-        print_sigcontext(sc);
+       tracebackothers((void*)sc->__r15);
+       print_sigcontext(sc);
 
        sys·breakpoint();
        sys·exit(2);
index 8180b3c8ec9c52f326140e31bbb04d961dd57dc4..b53f857cb02e50316deaf2ccd549de0a93545d1d 100644 (file)
@@ -19,6 +19,7 @@ sys·panicl(int32 lno)
        prints("\n");
        sp = (uint8*)&lno;
        traceback(sys·getcallerpc(&lno), sp, g);
+       tracebackothers(g);
        sys·breakpoint();
        sys·exit(2);
 }
index 9ee75349267aecabe02978cca881e757947a1059..26eb1af2ac6d5764f384ea1073f61653717fae62 100644 (file)
@@ -106,7 +106,7 @@ struct      G
        byte*   stackbase;      // must not move
        byte*   stack0;         // first stack segment
        Gobuf   sched;
-       G*      alllink;        // on allq
+       G*      alllink;        // on allg
        void*   param;          // passed parameter on wakeup
        int16   status;
        int32   goid;
@@ -189,6 +189,7 @@ void*       mal(uint32);
 uint32 cmpstring(string, string);
 void   initsig(void);
 void   traceback(uint8 *pc, uint8 *sp, G* gp);
+void   tracebackothers(G*);
 int32  open(byte*, int32, ...);
 int32  read(int32, void*, int32);
 int32  write(int32, void*, int32);