diff options
| author | Ian Lance Taylor <iant@golang.org> | 2015-12-11 17:16:48 -0800 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2016-04-01 04:13:44 +0000 |
| commit | ea306ae625d001a43ef20163739593a21be51f97 (patch) | |
| tree | 9123485cd4112995217584ee66e39c6f584533b2 /src/runtime/os1_linux.go | |
| parent | b64f549ba95fb9115afb1db8ae594b9442c45a6e (diff) | |
| download | go-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.go | 9 |
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 |
