17 #include "absl/debugging/internal/examine_stack.h"
23 #include "absl/base/config.h"
29 #if defined(__linux__) || defined(__APPLE__)
30 #include <sys/ucontext.h>
36 #include "absl/base/attributes.h"
37 #include "absl/base/internal/raw_logging.h"
38 #include "absl/base/macros.h"
39 #include "absl/debugging/stacktrace.h"
40 #include "absl/debugging/symbolize.h"
44 namespace debugging_internal {
47 constexpr
int kDefaultDumpStackFramesLimit = 64;
57 void*
p = ::mmap(
nullptr, num_bytes, PROT_READ | PROT_WRITE,
58 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
59 return p == MAP_FAILED ? nullptr :
p;
63 #endif // ABSL_HAVE_MMAP
72 #endif // ABSL_HAVE_MMAP
77 const char*
const prefix) {
85 int framesize,
const char*
const prefix) {
88 snprintf(
buf,
sizeof(
buf),
"%s@ %*p (unknown)\n",
prefix,
99 const char*
const prefix) {
101 const char* symbol =
"(unknown)";
125 void*
const pc,
void*
const symbolize_pc,
126 int framesize,
const char*
const prefix) {
128 const char* symbol =
"(unknown)";
133 if (framesize <= 0) {
134 snprintf(
buf,
sizeof(
buf),
"%s@ %*p (unknown) %s\n",
prefix,
146 debug_stack_trace_hook = hook;
156 if (vuc !=
nullptr) {
157 ucontext_t*
context =
reinterpret_cast<ucontext_t*
>(vuc);
158 #if defined(__aarch64__)
159 return reinterpret_cast<void*
>(
context->uc_mcontext.pc);
160 #elif defined(__alpha__)
161 return reinterpret_cast<void*
>(
context->uc_mcontext.sc_pc);
162 #elif defined(__arm__)
163 return reinterpret_cast<void*
>(
context->uc_mcontext.arm_pc);
164 #elif defined(__hppa__)
165 return reinterpret_cast<void*
>(
context->uc_mcontext.sc_iaoq[0]);
166 #elif defined(__i386__)
168 return reinterpret_cast<void*
>(
context->uc_mcontext.gregs[14]);
169 #elif defined(__ia64__)
170 return reinterpret_cast<void*
>(
context->uc_mcontext.sc_ip);
171 #elif defined(__m68k__)
172 return reinterpret_cast<void*
>(
context->uc_mcontext.gregs[16]);
173 #elif defined(__mips__)
174 return reinterpret_cast<void*
>(
context->uc_mcontext.pc);
175 #elif defined(__powerpc64__)
176 return reinterpret_cast<void*
>(
context->uc_mcontext.gp_regs[32]);
177 #elif defined(__powerpc__)
178 return reinterpret_cast<void*
>(
context->uc_mcontext.uc_regs->gregs[32]);
179 #elif defined(__riscv)
180 return reinterpret_cast<void*
>(
context->uc_mcontext.__gregs[REG_PC]);
181 #elif defined(__s390__) && !defined(__s390x__)
182 return reinterpret_cast<void*
>(
context->uc_mcontext.psw.addr & 0x7fffffff);
183 #elif defined(__s390__) && defined(__s390x__)
184 return reinterpret_cast<void*
>(
context->uc_mcontext.psw.addr);
185 #elif defined(__sh__)
186 return reinterpret_cast<void*
>(
context->uc_mcontext.pc);
187 #elif defined(__sparc__) && !defined(__arch64__)
188 return reinterpret_cast<void*
>(
context->uc_mcontext.gregs[19]);
189 #elif defined(__sparc__) && defined(__arch64__)
190 return reinterpret_cast<void*
>(
context->uc_mcontext.mc_gregs[19]);
191 #elif defined(__x86_64__)
193 return reinterpret_cast<void*
>(
context->uc_mcontext.gregs[16]);
194 #elif defined(__e2k__)
195 return reinterpret_cast<void*
>(
context->uc_mcontext.cr0_hi);
196 #elif defined(__loongarch__)
197 return reinterpret_cast<void*
>(
context->uc_mcontext.__pc);
199 #error "Undefined Architecture."
202 #elif defined(__APPLE__)
203 if (vuc !=
nullptr) {
204 ucontext_t* signal_ucontext =
reinterpret_cast<ucontext_t*
>(vuc);
205 #if defined(__aarch64__)
206 return reinterpret_cast<void*
>(
207 __darwin_arm_thread_state64_get_pc(signal_ucontext->uc_mcontext->__ss));
208 #elif defined(__arm__)
210 return reinterpret_cast<void*
>(signal_ucontext->uc_mcontext->__ss.__pc);
212 return reinterpret_cast<void*
>(signal_ucontext->uc_mcontext->ss.pc);
214 #elif defined(__i386__)
216 return reinterpret_cast<void*
>(signal_ucontext->uc_mcontext->__ss.__eip);
218 return reinterpret_cast<void*
>(signal_ucontext->uc_mcontext->ss.eip);
220 #elif defined(__x86_64__)
222 return reinterpret_cast<void*
>(signal_ucontext->uc_mcontext->__ss.__rip);
224 return reinterpret_cast<void*
>(signal_ucontext->uc_mcontext->ss.rip);
228 #elif defined(__akaros__)
229 auto*
ctx =
reinterpret_cast<struct user_context*
>(vuc);
230 return reinterpret_cast<void*
>(get_user_ctx_pc(
ctx));
232 static_cast<void>(vuc);
237 int frame_sizes[],
int depth,
238 int min_dropped_frames,
239 bool symbolize_stacktrace,
243 if (symbolize_stacktrace) {
250 if (symbolize_stacktrace) {
257 reinterpret_cast<char*
>(
stack[
i]) - 1,
258 frame_sizes[
i],
" ");
263 if (min_dropped_frames > 0) {
265 snprintf(
buf,
sizeof(
buf),
" @ ... and at least %d more frames\n",
278 void* stack_buf[kDefaultDumpStackFramesLimit];
279 void**
stack = stack_buf;
280 int num_stack = kDefaultDumpStackFramesLimit;
281 int allocated_bytes = 0;
283 if (num_stack >= max_num_frames) {
285 num_stack = max_num_frames;
287 const size_t needed_bytes = max_num_frames *
sizeof(
stack[0]);
290 num_stack = max_num_frames;
291 stack =
reinterpret_cast<void**
>(p);
292 allocated_bytes = needed_bytes;
297 for (
size_t i = 0;
i <
depth;
i++) {
298 if (symbolize_stacktrace) {
306 if (hook !=
nullptr) {