runtime: print C functions in traceback
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 30 Nov 2016 20:28:28 +0000 (20:28 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 30 Nov 2016 20:28:28 +0000 (20:28 +0000)
    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.

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

    Reviewed-on: https://go-review.googlesource.com/33717

From-SVN: r243083

gcc/go/gofrontend/MERGE
libgo/go/runtime/traceback_gccgo.go

index ead134c5fe307ce913deb7a05169e9c38002149a..323b07cb8c76bad6bac7cc33fd6c5ac4fc0ee34d 100644 (file)
@@ -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 b102826f4228fa3be8374fa27e060406159192b6..f61f9a0f2ddd895437a126421b06a6058d8a3590 100644 (file)
@@ -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