stacktrace_x86-inl.inc (15885B)
1 // Copyright 2017 The Abseil Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 // 15 // Produce stack trace 16 17 #ifndef ABSL_DEBUGGING_INTERNAL_STACKTRACE_X86_INL_INC_ 18 #define ABSL_DEBUGGING_INTERNAL_STACKTRACE_X86_INL_INC_ 19 20 #if defined(__linux__) && (defined(__i386__) || defined(__x86_64__)) 21 #include <ucontext.h> // for ucontext_t 22 #endif 23 24 #if !defined(_WIN32) 25 #include <unistd.h> 26 #endif 27 28 #include <cassert> 29 #include <cstdint> 30 #include <limits> 31 32 #include "absl/base/attributes.h" 33 #include "absl/base/macros.h" 34 #include "absl/base/port.h" 35 #include "absl/debugging/internal/address_is_readable.h" 36 #include "absl/debugging/internal/addresses.h" 37 #include "absl/debugging/internal/vdso_support.h" // a no-op on non-elf or non-glibc systems 38 #include "absl/debugging/stacktrace.h" 39 40 using absl::debugging_internal::AddressIsReadable; 41 42 #if defined(__linux__) && defined(__i386__) 43 // Count "push %reg" instructions in VDSO __kernel_vsyscall(), 44 // preceding "syscall" or "sysenter". 45 // If __kernel_vsyscall uses frame pointer, answer 0. 46 // 47 // kMaxBytes tells how many instruction bytes of __kernel_vsyscall 48 // to analyze before giving up. Up to kMaxBytes+1 bytes of 49 // instructions could be accessed. 50 // 51 // Here are known __kernel_vsyscall instruction sequences: 52 // 53 // SYSENTER (linux-2.6.26/arch/x86/vdso/vdso32/sysenter.S). 54 // Used on Intel. 55 // 0xffffe400 <__kernel_vsyscall+0>: push %ecx 56 // 0xffffe401 <__kernel_vsyscall+1>: push %edx 57 // 0xffffe402 <__kernel_vsyscall+2>: push %ebp 58 // 0xffffe403 <__kernel_vsyscall+3>: mov %esp,%ebp 59 // 0xffffe405 <__kernel_vsyscall+5>: sysenter 60 // 61 // SYSCALL (see linux-2.6.26/arch/x86/vdso/vdso32/syscall.S). 62 // Used on AMD. 63 // 0xffffe400 <__kernel_vsyscall+0>: push %ebp 64 // 0xffffe401 <__kernel_vsyscall+1>: mov %ecx,%ebp 65 // 0xffffe403 <__kernel_vsyscall+3>: syscall 66 // 67 68 // The sequence below isn't actually expected in Google fleet, 69 // here only for completeness. Remove this comment from OSS release. 70 71 // i386 (see linux-2.6.26/arch/x86/vdso/vdso32/int80.S) 72 // 0xffffe400 <__kernel_vsyscall+0>: int $0x80 73 // 0xffffe401 <__kernel_vsyscall+1>: ret 74 // 75 static const int kMaxBytes = 10; 76 77 // We use assert()s instead of DCHECK()s -- this is too low level 78 // for DCHECK(). 79 80 static int CountPushInstructions(const unsigned char *const addr) { 81 int result = 0; 82 for (int i = 0; i < kMaxBytes; ++i) { 83 if (addr[i] == 0x89) { 84 // "mov reg,reg" 85 if (addr[i + 1] == 0xE5) { 86 // Found "mov %esp,%ebp". 87 return 0; 88 } 89 ++i; // Skip register encoding byte. 90 } else if (addr[i] == 0x0F && 91 (addr[i + 1] == 0x34 || addr[i + 1] == 0x05)) { 92 // Found "sysenter" or "syscall". 93 return result; 94 } else if ((addr[i] & 0xF0) == 0x50) { 95 // Found "push %reg". 96 ++result; 97 } else if (addr[i] == 0xCD && addr[i + 1] == 0x80) { 98 // Found "int $0x80" 99 assert(result == 0); 100 return 0; 101 } else { 102 // Unexpected instruction. 103 assert(false && "unexpected instruction in __kernel_vsyscall"); 104 return 0; 105 } 106 } 107 // Unexpected: didn't find SYSENTER or SYSCALL in 108 // [__kernel_vsyscall, __kernel_vsyscall + kMaxBytes) interval. 109 assert(false && "did not find SYSENTER or SYSCALL in __kernel_vsyscall"); 110 return 0; 111 } 112 #endif 113 114 // Assume stack frames larger than 100,000 bytes are bogus. 115 static const int kMaxFrameBytes = 100000; 116 // Stack end to use when we don't know the actual stack end 117 // (effectively just the end of address space). 118 constexpr uintptr_t kUnknownStackEnd = 119 std::numeric_limits<size_t>::max() - sizeof(void *); 120 121 // Returns the stack frame pointer from signal context, 0 if unknown. 122 // vuc is a ucontext_t *. We use void* to avoid the use 123 // of ucontext_t on non-POSIX systems. 124 static uintptr_t GetFP(const void *vuc) { 125 #if !defined(__linux__) 126 static_cast<void>(vuc); // Avoid an unused argument compiler warning. 127 #else 128 if (vuc != nullptr) { 129 auto *uc = reinterpret_cast<const ucontext_t *>(vuc); 130 #if defined(__i386__) 131 const auto bp = uc->uc_mcontext.gregs[REG_EBP]; 132 const auto sp = uc->uc_mcontext.gregs[REG_ESP]; 133 #elif defined(__x86_64__) 134 const auto bp = uc->uc_mcontext.gregs[REG_RBP]; 135 const auto sp = uc->uc_mcontext.gregs[REG_RSP]; 136 #else 137 const uintptr_t bp = 0; 138 const uintptr_t sp = 0; 139 #endif 140 // Sanity-check that the base pointer is valid. It's possible that some 141 // code in the process is compiled with --copt=-fomit-frame-pointer or 142 // --copt=-momit-leaf-frame-pointer. 143 // 144 // TODO(bcmills): -momit-leaf-frame-pointer is currently the default 145 // behavior when building with clang. Talk to the C++ toolchain team about 146 // fixing that. 147 if (bp >= sp && bp - sp <= kMaxFrameBytes) 148 return static_cast<uintptr_t>(bp); 149 150 // If bp isn't a plausible frame pointer, return the stack pointer instead. 151 // If we're lucky, it points to the start of a stack frame; otherwise, we'll 152 // get one frame of garbage in the stack trace and fail the sanity check on 153 // the next iteration. 154 return static_cast<uintptr_t>(sp); 155 } 156 #endif 157 return 0; 158 } 159 160 // Given a pointer to a stack frame, locate and return the calling 161 // stackframe, or return null if no stackframe can be found. Perform sanity 162 // checks (the strictness of which is controlled by the boolean parameter 163 // "STRICT_UNWINDING") to reduce the chance that a bad pointer is returned. 164 template <bool STRICT_UNWINDING, bool WITH_CONTEXT> 165 ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS // May read random elements from stack. 166 ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY // May read random elements from stack. 167 static void **NextStackFrame(void **old_fp, const void *uc, 168 size_t stack_low, size_t stack_high) { 169 void **new_fp = (void **)*old_fp; 170 171 #if defined(__linux__) && defined(__i386__) 172 if (WITH_CONTEXT && uc != nullptr) { 173 // How many "push %reg" instructions are there at __kernel_vsyscall? 174 // This is constant for a given kernel and processor, so compute 175 // it only once. 176 static int num_push_instructions = -1; // Sentinel: not computed yet. 177 // Initialize with sentinel value: __kernel_rt_sigreturn can not possibly 178 // be there. 179 static const unsigned char *kernel_rt_sigreturn_address = nullptr; 180 static const unsigned char *kernel_vsyscall_address = nullptr; 181 if (num_push_instructions == -1) { 182 #ifdef ABSL_HAVE_VDSO_SUPPORT 183 absl::debugging_internal::VDSOSupport vdso; 184 if (vdso.IsPresent()) { 185 absl::debugging_internal::VDSOSupport::SymbolInfo 186 rt_sigreturn_symbol_info; 187 absl::debugging_internal::VDSOSupport::SymbolInfo vsyscall_symbol_info; 188 if (!vdso.LookupSymbol("__kernel_rt_sigreturn", "LINUX_2.5", STT_FUNC, 189 &rt_sigreturn_symbol_info) || 190 !vdso.LookupSymbol("__kernel_vsyscall", "LINUX_2.5", STT_FUNC, 191 &vsyscall_symbol_info) || 192 rt_sigreturn_symbol_info.address == nullptr || 193 vsyscall_symbol_info.address == nullptr) { 194 // Unexpected: 32-bit VDSO is present, yet one of the expected 195 // symbols is missing or null. 196 assert(false && "VDSO is present, but doesn't have expected symbols"); 197 num_push_instructions = 0; 198 } else { 199 kernel_rt_sigreturn_address = 200 reinterpret_cast<const unsigned char *>( 201 rt_sigreturn_symbol_info.address); 202 kernel_vsyscall_address = 203 reinterpret_cast<const unsigned char *>( 204 vsyscall_symbol_info.address); 205 num_push_instructions = 206 CountPushInstructions(kernel_vsyscall_address); 207 } 208 } else { 209 num_push_instructions = 0; 210 } 211 #else // ABSL_HAVE_VDSO_SUPPORT 212 num_push_instructions = 0; 213 #endif // ABSL_HAVE_VDSO_SUPPORT 214 } 215 if (num_push_instructions != 0 && kernel_rt_sigreturn_address != nullptr && 216 old_fp[1] == kernel_rt_sigreturn_address) { 217 const ucontext_t *ucv = static_cast<const ucontext_t *>(uc); 218 // This kernel does not use frame pointer in its VDSO code, 219 // and so %ebp is not suitable for unwinding. 220 void **const reg_ebp = 221 reinterpret_cast<void **>(ucv->uc_mcontext.gregs[REG_EBP]); 222 const unsigned char *const reg_eip = 223 reinterpret_cast<unsigned char *>(ucv->uc_mcontext.gregs[REG_EIP]); 224 if (new_fp == reg_ebp && kernel_vsyscall_address <= reg_eip && 225 reg_eip - kernel_vsyscall_address < kMaxBytes) { 226 // We "stepped up" to __kernel_vsyscall, but %ebp is not usable. 227 // Restore from 'ucv' instead. 228 void **const reg_esp = 229 reinterpret_cast<void **>(ucv->uc_mcontext.gregs[REG_ESP]); 230 // Check that alleged %esp is not null and is reasonably aligned. 231 if (reg_esp && 232 ((uintptr_t)reg_esp & (sizeof(reg_esp) - 1)) == 0) { 233 // Check that alleged %esp is actually readable. This is to prevent 234 // "double fault" in case we hit the first fault due to e.g. stack 235 // corruption. 236 void *const reg_esp2 = reg_esp[num_push_instructions - 1]; 237 if (AddressIsReadable(reg_esp2)) { 238 // Alleged %esp is readable, use it for further unwinding. 239 new_fp = reinterpret_cast<void **>(reg_esp2); 240 } 241 } 242 } 243 } 244 } 245 #endif 246 247 const uintptr_t old_fp_u = reinterpret_cast<uintptr_t>(old_fp); 248 const uintptr_t new_fp_u = reinterpret_cast<uintptr_t>(new_fp); 249 250 // Check that the transition from frame pointer old_fp to frame 251 // pointer new_fp isn't clearly bogus. Skip the checks if new_fp 252 // matches the signal context, so that we don't skip out early when 253 // using an alternate signal stack. 254 // 255 // TODO(bcmills): The GetFP call should be completely unnecessary when 256 // ENABLE_COMBINED_UNWINDER is set (because we should be back in the thread's 257 // stack by this point), but it is empirically still needed (e.g. when the 258 // stack includes a call to abort). unw_get_reg returns UNW_EBADREG for some 259 // frames. Figure out why GetValidFrameAddr and/or libunwind isn't doing what 260 // it's supposed to. 261 if (STRICT_UNWINDING && 262 (!WITH_CONTEXT || uc == nullptr || new_fp_u != GetFP(uc))) { 263 // With the stack growing downwards, older stack frame must be 264 // at a greater address that the current one. 265 if (new_fp_u <= old_fp_u) return nullptr; 266 267 // If we get a very large frame size, it may be an indication that we 268 // guessed frame pointers incorrectly and now risk a paging fault 269 // dereferencing a wrong frame pointer. Or maybe not because large frames 270 // are possible as well. The main stack is assumed to be readable, 271 // so we assume the large frame is legit if we know the real stack bounds 272 // and are within the stack. 273 if (new_fp_u - old_fp_u > kMaxFrameBytes) { 274 if (stack_high < kUnknownStackEnd && 275 static_cast<size_t>(getpagesize()) < stack_low) { 276 // Stack bounds are known. 277 if (!(stack_low < new_fp_u && new_fp_u <= stack_high)) { 278 // new_fp_u is not within the known stack. 279 return nullptr; 280 } 281 } else { 282 // Stack bounds are unknown, prefer truncated stack to possible crash. 283 return nullptr; 284 } 285 } 286 if (stack_low < old_fp_u && old_fp_u <= stack_high) { 287 // Old BP was in the expected stack region... 288 if (!(stack_low < new_fp_u && new_fp_u <= stack_high)) { 289 // ... but new BP is outside of expected stack region. 290 // It is most likely bogus. 291 return nullptr; 292 } 293 } else { 294 // We may be here if we are executing in a co-routine with a 295 // separate stack. We can't do safety checks in this case. 296 } 297 } else { 298 if (new_fp == nullptr) return nullptr; // skip AddressIsReadable() below 299 // In the non-strict mode, allow discontiguous stack frames. 300 // (alternate-signal-stacks for example). 301 if (new_fp == old_fp) return nullptr; 302 } 303 304 if (new_fp_u & (sizeof(void *) - 1)) return nullptr; 305 #ifdef __i386__ 306 // On 32-bit machines, the stack pointer can be very close to 307 // 0xffffffff, so we explicitly check for a pointer into the 308 // last two pages in the address space 309 if (new_fp_u >= 0xffffe000) return nullptr; 310 #endif 311 #if !defined(_WIN32) 312 if (!STRICT_UNWINDING) { 313 // Lax sanity checks cause a crash in 32-bit tcmalloc/crash_reason_test 314 // on AMD-based machines with VDSO-enabled kernels. 315 // Make an extra sanity check to insure new_fp is readable. 316 // Note: NextStackFrame<false>() is only called while the program 317 // is already on its last leg, so it's ok to be slow here. 318 319 if (!AddressIsReadable(new_fp)) { 320 return nullptr; 321 } 322 } 323 #endif 324 return new_fp; 325 } 326 327 template <bool IS_STACK_FRAMES, bool IS_WITH_CONTEXT> 328 ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS // May read random elements from stack. 329 ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY // May read random elements from stack. 330 ABSL_ATTRIBUTE_NOINLINE 331 static int UnwindImpl(void **result, uintptr_t *frames, int *sizes, 332 int max_depth, int skip_count, const void *ucp, 333 int *min_dropped_frames) { 334 int n = 0; 335 void **fp = reinterpret_cast<void **>(__builtin_frame_address(0)); 336 337 // Assume that the first page is not stack. 338 size_t stack_low = static_cast<size_t>(getpagesize()); 339 size_t stack_high = kUnknownStackEnd; 340 341 while (fp && n < max_depth) { 342 if (*(fp + 1) == reinterpret_cast<void *>(0)) { 343 // In 64-bit code, we often see a frame that 344 // points to itself and has a return address of 0. 345 break; 346 } 347 void **next_fp = NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>( 348 fp, ucp, stack_low, stack_high); 349 if (skip_count > 0) { 350 skip_count--; 351 } else { 352 result[n] = *(fp + 1); 353 if (IS_STACK_FRAMES) { 354 if (frames) { 355 frames[n] = absl::debugging_internal::StripPointerMetadata(fp) + 356 2 * sizeof(void *) /* go past the return address */; 357 } 358 if (sizes) { 359 if (next_fp > fp) { 360 sizes[n] = static_cast<int>( 361 absl::debugging_internal::StripPointerMetadata(next_fp) - 362 absl::debugging_internal::StripPointerMetadata(fp)); 363 } else { 364 // A frame-size of 0 is used to indicate unknown frame size. 365 sizes[n] = 0; 366 } 367 } 368 } 369 n++; 370 } 371 fp = next_fp; 372 } 373 if (min_dropped_frames != nullptr) { 374 // Implementation detail: we clamp the max of frames we are willing to 375 // count, so as not to spend too much time in the loop below. 376 const int kMaxUnwind = 1000; 377 int num_dropped_frames = 0; 378 for (int j = 0; fp != nullptr && j < kMaxUnwind; j++) { 379 if (skip_count > 0) { 380 skip_count--; 381 } else { 382 num_dropped_frames++; 383 } 384 fp = NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(fp, ucp, stack_low, 385 stack_high); 386 } 387 *min_dropped_frames = num_dropped_frames; 388 } 389 return n; 390 } 391 392 namespace absl { 393 ABSL_NAMESPACE_BEGIN 394 namespace debugging_internal { 395 bool StackTraceWorksForTest() { 396 return true; 397 } 398 } // namespace debugging_internal 399 ABSL_NAMESPACE_END 400 } // namespace absl 401 402 #endif // ABSL_DEBUGGING_INTERNAL_STACKTRACE_X86_INL_INC_