]> Cypherpunks repositories - gostls13.git/commitdiff
write stack traces and panics to stderr
authorRob Pike <r@golang.org>
Wed, 14 Oct 2009 05:48:03 +0000 (22:48 -0700)
committerRob Pike <r@golang.org>
Wed, 14 Oct 2009 05:48:03 +0000 (22:48 -0700)
R=rsc
DELTA=31  (5 added, 3 deleted, 23 changed)
OCL=35700
CL=35700

src/pkg/runtime/print.c
src/pkg/runtime/runtime.c
src/pkg/runtime/runtime.h
test/ken/complit.go
test/run

index 4a358a8116f555d28e6d4975543648ce2b576722..15cffdfd4071d8fe1fe21eba5d5d0dde64c50975 100644 (file)
@@ -26,7 +26,7 @@ dump(byte *p, int32 n)
 void
 prints(int8 *s)
 {
-       write(1, s, findnull((byte*)s));
+       write(fd, s, findnull((byte*)s));
 }
 
 // Very simple printf.  Only for debugging prints.
@@ -45,7 +45,7 @@ printf(int8 *s, ...)
                if(*p != '%')
                        continue;
                if(p > lp)
-                       write(1, lp, p-lp);
+                       write(fd, lp, p-lp);
                p++;
                narg = nil;
                switch(*p) {
@@ -98,7 +98,7 @@ printf(int8 *s, ...)
                lp = p+1;
        }
        if(p > lp)
-               write(1, lp, p-lp);
+               write(fd, lp, p-lp);
 
 //     unlock(&debuglock);
 }
@@ -115,10 +115,10 @@ void
 sys·printbool(bool v)
 {
        if(v) {
-               write(1, (byte*)"true", 4);
+               write(fd, (byte*)"true", 4);
                return;
        }
-       write(1, (byte*)"false", 5);
+       write(fd, (byte*)"false", 5);
 }
 
 void
@@ -129,15 +129,15 @@ sys·printfloat(float64 v)
        float64 h;
 
        if(isNaN(v)) {
-               write(1, "NaN", 3);
+               write(fd, "NaN", 3);
                return;
        }
        if(isInf(v, 0)) {
-               write(1, "+Inf", 4);
+               write(fd, "+Inf", 4);
                return;
        }
        if(isInf(v, -1)) {
-               write(1, "+Inf", 4);
+               write(fd, "+Inf", 4);
                return;
        }
 
@@ -196,7 +196,7 @@ sys·printfloat(float64 v)
        buf[n+4] = (e/100) + '0';
        buf[n+5] = (e/10)%10 + '0';
        buf[n+6] = (e%10) + '0';
-       write(1, buf, n+7);
+       write(fd, buf, n+7);
 }
 
 void
@@ -211,14 +211,14 @@ sys·printuint(uint64 v)
                        break;
                v = v/10;
        }
-       write(1, buf+i, nelem(buf)-i);
+       write(fd, buf+i, nelem(buf)-i);
 }
 
 void
 sys·printint(int64 v)
 {
        if(v < 0) {
-               write(1, "-", 1);
+               write(fd, "-", 1);
                v = -v;
        }
        sys·printuint(v);
@@ -238,7 +238,7 @@ sys·printhex(uint64 v)
                buf[--i] = '0';
        buf[--i] = 'x';
        buf[--i] = '0';
-       write(1, buf+i, nelem(buf)-i);
+       write(fd, buf+i, nelem(buf)-i);
 }
 
 void
@@ -253,21 +253,21 @@ sys·printstring(String v)
        extern int32 maxstring;
 
        if(v.len > maxstring) {
-               write(1, "[invalid string]", 16);
+               write(fd, "[invalid string]", 16);
                return;
        }
        if(v.len > 0)
-               write(1, v.str, v.len);
+               write(fd, v.str, v.len);
 }
 
 void
 sys·printsp(void)
 {
-       write(1, " ", 1);
+       write(fd, " ", 1);
 }
 
 void
 sys·printnl(void)
 {
-       write(1, "\n", 1);
+       write(fd, "\n", 1);
 }
index 6f359e1846760ef4aab18a97337d8bcce50bdaf8..4dcd3da1501138a3906a72ee456381de0b5d77f0 100644 (file)
@@ -6,6 +6,7 @@
 
 int32  panicking       = 0;
 int32  maxround        = sizeof(uintptr);
+int32  fd              = 1;
 
 int32
 gotraceback(void)
@@ -23,6 +24,7 @@ sys·panicl(int32 lno)
 {
        uint8 *sp;
 
+       fd = 2;
        if(panicking) {
                printf("double panic\n");
                exit(3);
@@ -66,6 +68,7 @@ sys·throwinit(void)
 void
 throw(int8 *s)
 {
+       fd = 2;
        printf("throw: %s\n", s);
        sys·panicl(-1);
        *(int32*)0 = 0; // not reached
index b560d68f98c23128c38912eb63fea932d305f31c..fe3194d543b41108f579e085401f5dbffeb8ef51 100644 (file)
@@ -312,6 +312,7 @@ int32       goidgen;
 extern int32   gomaxprocs;
 extern int32   panicking;
 extern int32   maxround;
+extern int32   fd;     // usually 1; set to 2 when panicking
 int8*  goos;
 
 /*
@@ -412,7 +413,8 @@ void        lock(Lock*);
 void   unlock(Lock*);
 
 /*
- * sleep and wakeup on one-time events.
+ * sleep and wakeup on one-time events, like
+ * Notification (but shorter to type).
  * before any calls to notesleep or notewakeup,
  * must call noteclear to initialize the Note.
  * then, any number of threads can call notesleep
index f54da7b4276ac1096417b660f3aa9a75e1096064..3132cf993619782ea3ae59e322718ffd7c19f6ba 100644 (file)
@@ -1,3 +1,5 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
 // Copyright 2009 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
index a86ce4977ebf653888518d007234f6d3c57700b2..8b3bc4149c7390405849eff3cf1336a8722a7f25 100755 (executable)
--- a/test/run
+++ b/test/run
@@ -36,7 +36,6 @@ PATH=/bin:/usr/bin:/usr/local/bin:${GOBIN:-$HOME/bin}:`pwd`
 RUNFILE=/tmp/gorun-$$-$USER
 TMP1FILE=/tmp/gotest1-$$-$USER
 TMP2FILE=/tmp/gotest2-$$-$USER
-TMP3FILE=/tmp/gotest3-$$-$USER
 
 # don't run the machine out of memory: limit individual processes to 4GB.
 # on thresher, 3GB suffices to run the tests; with 2GB, peano fails.
@@ -53,26 +52,24 @@ do
                export F=$(basename $i .go)
                export D=$dir
                sed '/^\/\//!q' $i | sed 's@//@@; $d' |sed 's|./\$A.out|$E &|' >$RUNFILE
-               if ! /usr/bin/time -p sh -c "sh $RUNFILE >$TMP1FILE 2>$TMP2FILE" 2>$TMP3FILE
+               if ! /usr/bin/time -p sh -c "sh $RUNFILE >$TMP1FILE 2>&1" 2>$TMP2FILE
                then
                        echo
                        echo "===========" $i
                        cat $TMP1FILE
-                       cat $TMP2FILE
                        echo >&2 fail: $i
-               elif test -s $TMP1FILE || test -s $TMP2FILE
+               elif test -s $TMP1FILE
                then
                        echo
                        echo "===========" $i
                        cat $TMP1FILE
-                       cat $TMP2FILE
                elif [ $dir = "bugs" ]
                then
                        echo $i succeeded with no output.
                else
                        echo $i >>pass.out
                fi
-               echo $(awk 'NR==1{print $2}' $TMP3FILE) $D/$F >>times.out
+               echo $(awk 'NR==1{print $2}' $TMP2FILE) $D/$F >>times.out
        done
 done | # clean up some stack noise
        egrep -v '^(r[0-9a-z]+|[cfg]s)  +0x'  |
@@ -90,7 +87,7 @@ case $failed in
 1)
        echo FAIL
 esac
-rm  -f $RUNFILE $TMP1FILE $TMP2FILE $TMP3FILE *.$A $A.out
+rm  -f $RUNFILE $TMP1FILE $TMP2FILE *.$A $A.out
 diffmsg=""
 if ! diff run.out golden.out
 then