aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/os1_linux.go
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2015-12-11 17:16:48 -0800
committerIan Lance Taylor <iant@golang.org>2016-04-01 04:13:44 +0000
commitea306ae625d001a43ef20163739593a21be51f97 (patch)
tree9123485cd4112995217584ee66e39c6f584533b2 /src/runtime/os1_linux.go
parentb64f549ba95fb9115afb1db8ae594b9442c45a6e (diff)
downloadgo-ea306ae625d001a43ef20163739593a21be51f97.tar.xz
runtime: support symbolic backtrace of C code in a cgo crash
The new function runtime.SetCgoTraceback may be used to register stack traceback and symbolizer functions, written in C, to do a stack traceback from cgo code. There is a sample implementation of runtime.SetCgoSymbolizer at github.com/ianlancetaylor/cgosymbolizer. Just importing that package is sufficient to get symbolic C backtraces. Currently only supported on linux/amd64. Change-Id: If96ee2eb41c6c7379d407b9561b87557bfe47341 Reviewed-on: https://go-review.googlesource.com/17761 Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/runtime/os1_linux.go')
-rw-r--r--src/runtime/os1_linux.go9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/runtime/os1_linux.go b/src/runtime/os1_linux.go
index 1c1ead8790..726dd649fe 100644
--- a/src/runtime/os1_linux.go
+++ b/src/runtime/os1_linux.go
@@ -305,6 +305,7 @@ func memlimit() uintptr {
func sigreturn()
func sigtramp()
+func cgoSigtramp()
//go:nosplit
//go:nowritebarrierrec
@@ -323,7 +324,11 @@ func setsig(i int32, fn uintptr, restart bool) {
sa.sa_restorer = funcPC(sigreturn)
}
if fn == funcPC(sighandler) {
- fn = funcPC(sigtramp)
+ if iscgo {
+ fn = funcPC(cgoSigtramp)
+ } else {
+ fn = funcPC(sigtramp)
+ }
}
sa.sa_handler = fn
rt_sigaction(uintptr(i), &sa, nil, unsafe.Sizeof(sa.sa_mask))
@@ -354,7 +359,7 @@ func getsig(i int32) uintptr {
if rt_sigaction(uintptr(i), nil, &sa, unsafe.Sizeof(sa.sa_mask)) != 0 {
throw("rt_sigaction read failure")
}
- if sa.sa_handler == funcPC(sigtramp) {
+ if sa.sa_handler == funcPC(sigtramp) || sa.sa_handler == funcPC(cgoSigtramp) {
return funcPC(sighandler)
}
return sa.sa_handler