test cleanup
- do not print tracebacks if $GOTRACEBACK=0
- set GOTRACEBACK=0 during tests
- filter out pc numbers in errors
R=r
DELTA=70 (22 added, 30 deleted, 18 changed)
OCL=15618
CL=15642
diff --git a/src/runtime/rt1_amd64_darwin.c b/src/runtime/rt1_amd64_darwin.c
index cf4f3bc..02f03cd 100644
--- a/src/runtime/rt1_amd64_darwin.c
+++ b/src/runtime/rt1_amd64_darwin.c
@@ -150,9 +150,11 @@
prints("\npc: 0x"); sys·printpointer((void *)ss->__rip);
prints("\n\n");
- traceback((void *)ss->__rip, (void *)ss->__rsp, (void*)ss->__r15);
- tracebackothers((void*)ss->__r15);
- print_thread_state(ss);
+ if(gotraceback()){
+ traceback((void *)ss->__rip, (void *)ss->__rsp, (void*)ss->__r15);
+ tracebackothers((void*)ss->__r15);
+ print_thread_state(ss);
+ }
sys·exit(2);
}
diff --git a/src/runtime/rt1_amd64_linux.c b/src/runtime/rt1_amd64_linux.c
index c62db5c..98a53f1 100644
--- a/src/runtime/rt1_amd64_linux.c
+++ b/src/runtime/rt1_amd64_linux.c
@@ -140,7 +140,7 @@
if(panicking) // traceback already printed
sys·exit(2);
- struct sigcontext *sc = &(((struct ucontext *)context)->uc_mcontext);
+ struct sigcontext *sc = &(((struct ucontext *)context)->uc_mcontext);
if(sig < 0 || sig >= NSIG){
prints("Signal ");
@@ -149,13 +149,15 @@
prints(sigtab[sig].name);
}
- prints("\nFaulting address: 0x"); sys·printpointer(info->si_addr);
- prints("\npc: 0x"); sys·printpointer((void *)sc->rip);
- prints("\n\n");
+ prints("\nFaulting address: 0x"); sys·printpointer(info->si_addr);
+ prints("\npc: 0x"); sys·printpointer((void *)sc->rip);
+ prints("\n\n");
- traceback((void *)sc->rip, (void *)sc->rsp, (void *)sc->r15);
- tracebackothers((void*)sc->r15);
- print_sigcontext(sc);
+ if(gotraceback()){
+ traceback((void *)sc->rip, (void *)sc->rsp, (void *)sc->r15);
+ tracebackothers((void*)sc->r15);
+ print_sigcontext(sc);
+ }
sys·breakpoint();
sys·exit(2);
diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c
index 2cbebda..5fde296 100644
--- a/src/runtime/runtime.c
+++ b/src/runtime/runtime.c
@@ -6,6 +6,17 @@
int32 panicking = 0;
+int32
+gotraceback(void)
+{
+ byte *p;
+
+ p = getenv("GOTRACEBACK");
+ if(p == nil || p[0] == '\0')
+ return 1; // default is on
+ return atoi(p);
+}
+
void
sys·panicl(int32 lno)
{
@@ -17,8 +28,10 @@
sys·printpc(&lno);
prints("\n");
sp = (uint8*)&lno;
- traceback(sys·getcallerpc(&lno), sp, g);
- tracebackothers(g);
+ if(gotraceback()){
+ traceback(sys·getcallerpc(&lno), sp, g);
+ tracebackothers(g);
+ }
panicking = 1;
sys·breakpoint(); // so we can grab it in a debugger
sys·exit(2);
diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h
index 04f1737..3d439ca 100644
--- a/src/runtime/runtime.h
+++ b/src/runtime/runtime.h
@@ -212,6 +212,7 @@
void* mal(uint32);
uint32 cmpstring(string, string);
void initsig(void);
+int32 gotraceback(void);
void traceback(uint8 *pc, uint8 *sp, G* gp);
void tracebackothers(G*);
int32 open(byte*, int32, ...);