Add internal API to allow bypassing stack trace fixups when needed PiperOrigin-RevId: 822668786 Change-Id: I72d6178bbbde8b05b529e2d8297772cbb63758d0
diff --git a/absl/debugging/stacktrace.cc b/absl/debugging/stacktrace.cc index 67df814..420005c 100644 --- a/absl/debugging/stacktrace.cc +++ b/absl/debugging/stacktrace.cc
@@ -78,7 +78,8 @@ ABSL_ATTRIBUTE_ALWAYS_INLINE inline int Unwind(void** result, uintptr_t* frames, int* sizes, size_t max_depth, int skip_count, const void* uc, - int* min_dropped_frames) { + int* min_dropped_frames, + bool unwind_with_fixup = true) { static constexpr size_t kMinPageSize = 4096; // Allow up to ~half a page, leaving some slack space for local variables etc. @@ -100,7 +101,8 @@ bool must_free_frames = false; bool must_free_sizes = false; - bool unwind_with_fixup = internal_stacktrace::ShouldFixUpStack(); + unwind_with_fixup = + unwind_with_fixup && internal_stacktrace::ShouldFixUpStack(); #ifdef _WIN32 if (unwind_with_fixup) { @@ -194,6 +196,14 @@ min_dropped_frames); } +ABSL_ATTRIBUTE_NOINLINE ABSL_ATTRIBUTE_NO_TAIL_CALL int +internal_stacktrace::GetStackTraceNoFixup(void** result, int max_depth, + int skip_count) { + return Unwind<false, false>(result, nullptr, nullptr, + static_cast<size_t>(max_depth), skip_count, + nullptr, nullptr, /*unwind_with_fixup=*/false); +} + ABSL_ATTRIBUTE_NOINLINE ABSL_ATTRIBUTE_NO_TAIL_CALL int GetStackTrace( void** result, int max_depth, int skip_count) { return Unwind<false, false>(result, nullptr, nullptr,
diff --git a/absl/debugging/stacktrace.h b/absl/debugging/stacktrace.h index 8777172..79f7651 100644 --- a/absl/debugging/stacktrace.h +++ b/absl/debugging/stacktrace.h
@@ -69,6 +69,9 @@ int* sizes, int max_depth, int skip_count, const void* uc, int* min_dropped_frames); +// As above, but skips fix-ups for efficiency. +extern int GetStackTraceNoFixup(void** result, int max_depth, int skip_count); + // Same as `absl::DefaultStackUnwinder`, but with an optional `frames` parameter // to allow callers to receive the raw stack frame addresses. // This is internal for now; do not depend on this externally.