diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2012-05-17 05:30:25 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2012-05-17 05:30:25 +0000 |
commit | d7b8f2b7816952c96c769c62eca10c647caa3530 (patch) | |
tree | ee128f558640851fefb4f2a94c2d38f45b2ee2a0 /libgo/runtime/runtime.c | |
parent | 8730965e4297b5f96210b2e80e70c5b302486723 (diff) | |
download | gcc-d7b8f2b7816952c96c769c62eca10c647caa3530.zip gcc-d7b8f2b7816952c96c769c62eca10c647caa3530.tar.gz gcc-d7b8f2b7816952c96c769c62eca10c647caa3530.tar.bz2 |
runtime: Print stack trace on panic or signal.
From-SVN: r187623
Diffstat (limited to 'libgo/runtime/runtime.c')
-rw-r--r-- | libgo/runtime/runtime.c | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/libgo/runtime/runtime.c b/libgo/runtime/runtime.c index c8443cb..3c8d762 100644 --- a/libgo/runtime/runtime.c +++ b/libgo/runtime/runtime.c @@ -11,6 +11,17 @@ uint32 runtime_panicking; +int32 +runtime_gotraceback(void) +{ + const byte *p; + + p = runtime_getenv("GOTRACEBACK"); + if(p == nil || p[0] == '\0') + return 1; // default is on + return runtime_atoi(p); +} + static Lock paniclk; void @@ -31,20 +42,26 @@ runtime_startpanic(void) void runtime_dopanic(int32 unused __attribute__ ((unused))) { - /* + G* g; static bool didothers; + g = runtime_g(); if(g->sig != 0) - runtime_printf("[signal %x code=%p addr=%p pc=%p]\n", - g->sig, g->sigcode0, g->sigcode1, g->sigpc); + runtime_printf("[signal %x code=%p addr=%p]\n", + g->sig, (void*)(g->sigcode0), (void*)(g->sigcode1)); if(runtime_gotraceback()){ + if(g != runtime_m()->g0) { + runtime_printf("\n"); + runtime_goroutineheader(g); + runtime_traceback(); + runtime_goroutinetrailer(g); + } if(!didothers) { didothers = true; runtime_tracebackothers(g); } } - */ runtime_unlock(&paniclk); if(runtime_xadd(&runtime_panicking, -1) != 0) { @@ -185,10 +202,10 @@ runtime_fastrand1(void) } static struct root_list runtime_roots = -{ NULL, +{ nil, { { &syscall_Envs, sizeof syscall_Envs }, { &os_Args, sizeof os_Args }, - { NULL, 0 } }, + { nil, 0 } }, }; void @@ -209,3 +226,13 @@ runtime_cputicks(void) return 0; #endif } + +bool +runtime_showframe(const unsigned char *s) +{ + static int32 traceback = -1; + + if(traceback < 0) + traceback = runtime_gotraceback(); + return traceback > 1 || (__builtin_strchr((const char*)s, '.') != nil && __builtin_memcmp(s, "runtime.", 7) != 0); +} |