This patch to libgo prints C functions when doing a stack traceback.

Since gccgo can trace back through C code as easily as Go code, we
should print C functions in the traceback.

This worked before https://golang.org/cl/31230 for a dumb reason.  The
default value for runtime.traceback_cache was, and is, 2 << 2, meaning
to print all functions.  The old C code for runtime_parsedebugvars
would return immediately and do nothing if the environment variable
GODEBUG was not set (if GODEBUG was set it would later call
setTraceback.  The new Go code for runtime.parsedebugvars does not
return immediately if GODEBUG is not set, and always calls
setTraceback.  Either way, if GOTRACEBACK is not set, setTraceback
would set traceback_cache to 1 << 2, meaning to only print non-runtime
functions and having the effect of not printing plain C functions.

This patch keeps the current handling of GODEBUG/GOTRACEBACK, which
matches the gc library, but add an extra check to print C functions by
default.

Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu.  Committed
to mainline.

Ian
Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE     (revision 242992)
+++ gcc/go/gofrontend/MERGE     (working copy)
@@ -1,4 +1,4 @@
-1d3e0ceee45012a1c3b4ff7f5119a72f90bfcf6a
+9be198d960e4bc46e21e4da1e3d4a1619266b8ab
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: libgo/go/runtime/traceback_gccgo.go
===================================================================
--- libgo/go/runtime/traceback_gccgo.go (revision 242724)
+++ libgo/go/runtime/traceback_gccgo.go (working copy)
@@ -89,6 +89,15 @@ func showframe(name string, gp *g) bool
        if g.m.throwing > 0 && gp != nil && (gp == g.m.curg || gp == 
g.m.caughtsig.ptr()) {
                return true
        }
+
+       // Gccgo can trace back through C functions called via cgo.
+       // We want to print those in the traceback.
+       // But unless GOTRACEBACK > 1 (checked below), still skip
+       // internal C functions and cgo-generated functions.
+       if !contains(name, ".") && !hasprefix(name, "__go_") && 
!hasprefix(name, "_cgo_") {
+               return true
+       }
+
        level, _, _ := gotraceback()
 
        // Special case: always show runtime.gopanic frame, so that we can

Reply via email to