6bd37418a3
In signal-triggered stack scan, if the signal is delivered at certain bad time (e.g. in vdso, or in the middle of setcontext?), the unwinder may not be able to unwind the whole stack, while it still reports _URC_END_OF_STACK. So we cannot rely on _URC_END_OF_STACK to tell if it successfully scanned the stack. Instead, we check the last Go frame to see it actually reached the end of the stack. For Go-created stack, this is runtime.kickoff. For C-created stack, we need to record the outermost Go frame when it enters the Go side. Also we cannot unwind the stack if the signal is delivered in the middle of runtime.gogo, halfway through a goroutine switch, where the g and the stack don't match. Give up in this case as well. Reviewed-on: https://go-review.googlesource.com/c/159098 From-SVN: r269018 |
||
---|---|---|
.. | ||
aeshash.c | ||
arch.h | ||
array.h | ||
defs.h | ||
env_posix.c | ||
getncpu-aix.c | ||
getncpu-bsd.c | ||
getncpu-hurd.c | ||
getncpu-irix.c | ||
getncpu-linux.c | ||
getncpu-none.c | ||
getncpu-solaris.c | ||
go-assert.c | ||
go-assert.h | ||
go-caller.c | ||
go-callers.c | ||
go-cdiv.c | ||
go-cgo.c | ||
go-construct-map.c | ||
go-ffi.c | ||
go-fieldtrack.c | ||
go-libmain.c | ||
go-main.c | ||
go-matherr.c | ||
go-memclr.c | ||
go-memcmp.c | ||
go-memequal.c | ||
go-memmove.c | ||
go-nanotime.c | ||
go-nosys.c | ||
go-now.c | ||
go-reflect-call.c | ||
go-runtime-error.c | ||
go-setenv.c | ||
go-signal.c | ||
go-string.h | ||
go-strslice.c | ||
go-type.h | ||
go-typedesc-equal.c | ||
go-unsafe-pointer.c | ||
go-unsetenv.c | ||
go-unwind.c | ||
go-varargs.c | ||
panic.c | ||
print.c | ||
proc.c | ||
rtems-task-variable-add.c | ||
runtime_c.c | ||
runtime.h | ||
stack.c | ||
yield.c |