mirror of
https://github.com/golang/go
synced 2024-11-05 18:36:08 +00:00
write stack traces and panics to stderr
R=rsc DELTA=31 (5 added, 3 deleted, 23 changed) OCL=35700 CL=35700
This commit is contained in:
parent
bf983a0df2
commit
f6d67c9e95
5 changed files with 28 additions and 24 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
11
test/run
11
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
|
||||
|
|
Loading…
Reference in a new issue