runtime: pass signal context to cgo traceback function
When doing a backtrace from a signal that occurs in C code compiled
without using -fasynchronous-unwind-tables, we have to rely on frame
pointers. In order to do that, the traceback function needs the signal
context to reliably pick up the frame pointer.
Change-Id: I7b45930fced01685c337d108e0f146057928f876
Reviewed-on: https://go-review.googlesource.com/23494
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go
index 279fb52..f9d9f21 100644
--- a/src/runtime/traceback.go
+++ b/src/runtime/traceback.go
@@ -858,15 +858,17 @@
// pointer to a struct:
//
// struct {
-// Context uintptr
-// Buf *uintptr
-// Max uintptr
+// Context uintptr
+// SigContext uintptr
+// Buf *uintptr
+// Max uintptr
// }
//
// In C syntax, this struct will be
//
// struct {
// uintptr_t Context;
+// uintptr_t SigContext;
// uintptr_t* Buf;
// uintptr_t Max;
// };
@@ -887,6 +889,13 @@
// result, if possible, the first time this is called for a specific
// context value.
//
+// If the traceback function is called from a signal handler on a Unix
+// system, SigContext will be the signal context argument passed to
+// the signal handler (a C ucontext_t* cast to uintptr_t). This may be
+// used to start tracing at the point where the signal occurred. If
+// the traceback function is not called from a signal handler,
+// SigContext will be zero.
+//
// Buf is where the traceback information should be stored. It should
// be PC values, such that Buf[0] is the PC of the caller, Buf[1] is
// the PC of that function's caller, and so on. Max is the maximum
@@ -973,9 +982,10 @@
// cgoTracebackArg is the type passed to cgoTraceback.
type cgoTracebackArg struct {
- context uintptr
- buf *uintptr
- max uintptr
+ context uintptr
+ sigContext uintptr
+ buf *uintptr
+ max uintptr
}
// cgoContextArg is the type passed to the context function.