Commit f4988f5b by Saleem Abdulrasool Committed by Copybara-Service

debugging: account for differences in alternate signal stacks

The alternate signal stack may be sufficiently beyond the esimated frame size
(100k).  If we run into the case that the frame is not in the correct direction
assume that the frames may be non-contiguous due to an alternate signal stack
layout.  In such a case, if we find that there is an alternate stack configured,
ignore the discontiuity (assuming that it is a removable point-wise
discontinuity) and continue the stack unwinding.  This permits us to capture
stack traces in more cases.

PiperOrigin-RevId: 458327775
Change-Id: Ia8b461847401492f72a23ba26601c72e0109402c
parent b35ae328
......@@ -159,6 +159,21 @@ static void ** NextStackFrame(void **old_frame_pointer, const void *uc) {
const uintptr_t max_size = STRICT_UNWINDING ? 100000 : 1000000;
const uintptr_t frame_size =
ComputeStackFrameSize(old_frame_pointer, new_frame_pointer);
// If we have a alternate signal stack, the stack pointer may not be
// contiguous. In such a case, we can simply skip the check and assume that
// the non-contiguity is permissible.
if (frame_size == kUnknownFrameSize) {
assert(old_frame_pointer >= new_frame_pointer);
stack_t ss{};
if (sigaltstack(nullptr, &ss) == 0) {
if (ss.ss_flags & SS_DISABLE)
return nullptr;
return new_frame_pointer;
}
}
if (frame_size == kUnknownFrameSize || frame_size > max_size)
return nullptr;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment