1 2 /*--------------------------------------------------------------------*/ 3 /*--- Take snapshots of client stacks. m_stacktrace.c ---*/ 4 /*--------------------------------------------------------------------*/ 5 6 /* 7 This file is part of Valgrind, a dynamic binary instrumentation 8 framework. 9 10 Copyright (C) 2000-2015 Julian Seward 11 jseward (at) acm.org 12 13 This program is free software; you can redistribute it and/or 14 modify it under the terms of the GNU General Public License as 15 published by the Free Software Foundation; either version 2 of the 16 License, or (at your option) any later version. 17 18 This program is distributed in the hope that it will be useful, but 19 WITHOUT ANY WARRANTY; without even the implied warranty of 20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21 General Public License for more details. 22 23 You should have received a copy of the GNU General Public License 24 along with this program; if not, write to the Free Software 25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 26 02111-1307, USA. 27 28 The GNU General Public License is contained in the file COPYING. 29 */ 30 31 #include "pub_core_basics.h" 32 #include "pub_core_vki.h" 33 #include "pub_core_threadstate.h" 34 #include "pub_core_debuginfo.h" // XXX: circular dependency 35 #include "pub_core_aspacemgr.h" // For VG_(is_addressable)() 36 #include "pub_core_libcbase.h" 37 #include "pub_core_libcassert.h" 38 #include "pub_core_libcprint.h" 39 #include "pub_core_machine.h" 40 #include "pub_core_options.h" 41 #include "pub_core_stacks.h" // VG_(stack_limits) 42 #include "pub_core_stacktrace.h" 43 #include "pub_core_syswrap.h" // VG_(is_in_syscall) 44 #include "pub_core_xarray.h" 45 #include "pub_core_clientstate.h" // VG_(client__dl_sysinfo_int80) 46 #include "pub_core_trampoline.h" 47 48 49 /*------------------------------------------------------------*/ 50 /*--- ---*/ 51 /*--- BEGIN platform-dependent unwinder worker functions ---*/ 52 /*--- ---*/ 53 /*------------------------------------------------------------*/ 54 55 /* Take a snapshot of the client's stack, putting up to 'max_n_ips' 56 IPs into 'ips'. In order to be thread-safe, we pass in the 57 thread's IP SP, FP if that's meaningful, and LR if that's 58 meaningful. Returns number of IPs put in 'ips'. 59 60 If you know what the thread ID for this stack is, send that as the 61 first parameter, else send zero. This helps generate better stack 62 traces on ppc64-linux and has no effect on other platforms. 63 */ 64 65 /* Do frame merging in the _i frames in _ips array of recursive cycles 66 of up to _nframes. The merge is done during stack unwinding 67 (i.e. in platform specific unwinders) to collect as many 68 "interesting" stack traces as possible. */ 69 #define RECURSIVE_MERGE(_nframes,_ips,_i) if (UNLIKELY(_nframes > 0)) \ 70 do { \ 71 Int dist; \ 72 for (dist = 1; dist <= _nframes && dist < (Int)_i; dist++) { \ 73 if (_ips[_i-1] == _ips[_i-1-dist]) { \ 74 _i = _i - dist; \ 75 break; \ 76 } \ 77 } \ 78 } while (0) 79 80 /* Note about calculation of fp_min : fp_min is the lowest address 81 which can be accessed during unwinding. This is SP - VG_STACK_REDZONE_SZB. 82 On most platforms, this will be equal to SP (as VG_STACK_REDZONE_SZB 83 is 0). However, on some platforms (e.g. amd64), there is an accessible 84 redzone below the SP. Some CFI unwind info are generated, taking this 85 into account. As an example, the following is a CFI unwind info on 86 amd64 found for a 'retq' instruction: 87 [0x400f7e .. 0x400f7e]: let cfa=oldSP+8 in RA=*(cfa+-8) SP=cfa+0 BP=*(cfa+-16) 88 0x400f7e: retq 89 As you can see, the previous BP is found 16 bytes below the cfa, which 90 is the oldSP+8. So, effectively, the BP is found 8 bytes below the SP. 91 The fp_min must take this into account, otherwise, VG_(use_CF_info) will 92 not unwind the BP. */ 93 94 /* ------------------------ x86 ------------------------- */ 95 96 #if defined(VGP_x86_linux) || defined(VGP_x86_darwin) \ 97 || defined(VGP_x86_solaris) 98 99 #define N_FP_CF_VERIF 1021 100 // prime number so that size of fp_CF_verif is just below 4K or 8K 101 // Note that this prime nr differs from the one chosen in 102 // m_debuginfo/debuginfo.c for the cfsi cache : in case we have 103 // a collision here between two IPs, we expect to not (often) have the 104 // same collision in the cfsi cache (and vice-versa). 105 106 // unwinding with fp chain is ok: 107 #define FPUNWIND 0 108 // there is no CFI info for this IP: 109 #define NOINFO 1 110 // Unwind with FP is not ok, must use CF unwind: 111 #define CFUNWIND 2 112 113 static Addr fp_CF_verif_cache [N_FP_CF_VERIF]; 114 115 /* An unwind done by following the fp chain technique can be incorrect 116 as not all frames are respecting the standard bp/sp ABI. 117 The CF information is now generated by default by gcc 118 (as part of the dwarf info). However, unwinding using CF information 119 is significantly slower : a slowdown of 20% has been observed 120 on an helgrind test case. 121 So, by default, the unwinding will be done using the fp chain. 122 But before accepting to unwind an IP with fp_chain, the result 123 of the unwind will be checked with the CF information. 124 This check can give 3 results: 125 FPUNWIND (0): there is CF info, and it gives the same result as fp unwind. 126 => it is assumed that future unwind for this IP can be done 127 with the fast fp chain, without further CF checking 128 NOINFO (1): there is no CF info (so, fp unwind is the only do-able thing) 129 CFUNWIND (2): there is CF info, but unwind result differs. 130 => it is assumed that future unwind for this IP must be done 131 with the CF info. 132 Of course, if each fp unwind implies a check done with a CF unwind, 133 it would just be slower => we cache the check result in an 134 array of checked Addr. 135 The check for an IP will be stored at 136 fp_CF_verif_cache[IP % N_FP_CF_VERIF] as one of: 137 IP ^ FPUNWIND 138 IP ^ NOINFO 139 IP ^ CFUNWIND 140 141 Note: we can re-use the last (ROUNDDOWN (log (N_FP_CF_VERIF))) bits 142 to store the check result, as they are guaranteed to be non significant 143 in the comparison between 2 IPs stored in fp_CF_verif_cache). 144 In other words, if two IPs are only differing on the last 2 bits, 145 then they will not land in the same cache bucket. 146 */ 147 148 /* cached result of VG_(FPO_info_present)(). Refreshed each time 149 the fp_CF_verif_generation is different of the current debuginfo 150 generation. */ 151 static Bool FPO_info_present = False; 152 153 static UInt fp_CF_verif_generation = 0; 154 // Our cache has to be maintained in sync with the CFI cache. 155 // Each time the debuginfo is changed, its generation will be incremented. 156 // We will clear our cache when our saved generation differs from 157 // the debuginfo generation. 158 159 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 160 /*OUT*/Addr* ips, UInt max_n_ips, 161 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 162 const UnwindStartRegs* startRegs, 163 Addr fp_max_orig ) 164 { 165 const Bool do_stats = False; // compute and output some stats regularly. 166 static struct { 167 UInt nr; // nr of stacktraces computed 168 UInt nf; // nr of frames computed 169 UInt Ca; // unwind for which cache indicates CFUnwind must be used. 170 UInt FF; // unwind for which cache indicates FPUnwind can be used. 171 UInt Cf; // unwind at end of stack+store CFUNWIND (xip not end of stack). 172 UInt Fw; // unwind at end of stack+store FPUNWIND 173 UInt FO; // unwind + store FPUNWIND 174 UInt CF; // unwind + store CFUNWIND. Details below. 175 UInt xi; UInt xs; UInt xb; // register(s) which caused a 'store CFUNWIND'. 176 UInt Ck; // unwind fp invalid+store FPUNWIND 177 UInt MS; // microsoft unwind 178 } stats; 179 180 const Bool debug = False; 181 // = VG_(debugLog_getLevel) () > 3; 182 // = True; 183 // = stats.nr >= 123456; 184 const HChar* unwind_case; // used when debug is True. 185 // Debugging this function is not straightforward. 186 // Here is the easiest way I have found: 187 // 1. Change the above to True. 188 // 2. Start your program under Valgrind with --tool=none --vgdb-error=0 189 // 3. Use GDB/vgdb to put a breakpoint where you want to debug the stacktrace 190 // 4. Continue till breakpoint is encountered 191 // 5. From GDB, use 'monitor v.info scheduler' and examine the unwind traces. 192 // You might have to do twice 'monitor v.info scheduler' to see 193 // the effect of caching the results of the verification. 194 // You can also modify the debug dynamically using by using 195 // 'monitor v.set debuglog 4. 196 197 Int i; 198 Addr fp_max; 199 UInt n_found = 0; 200 const Int cmrf = VG_(clo_merge_recursive_frames); 201 202 vg_assert(sizeof(Addr) == sizeof(UWord)); 203 vg_assert(sizeof(Addr) == sizeof(void*)); 204 205 D3UnwindRegs fpverif_uregs; // result of CF unwind for a check reason. 206 Addr xip_verified = 0; // xip for which we have calculated fpverif_uregs 207 // 0 assigned to silence false positive -Wuninitialized warning 208 // This is a false positive as xip_verified is assigned when 209 // xip_verif > CFUNWIND and only used if xip_verif > CFUNWIND. 210 211 D3UnwindRegs uregs; 212 uregs.xip = (Addr)startRegs->r_pc; 213 uregs.xsp = (Addr)startRegs->r_sp; 214 uregs.xbp = startRegs->misc.X86.r_ebp; 215 Addr fp_min = uregs.xsp - VG_STACK_REDZONE_SZB; 216 217 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1], 218 stopping when the trail goes cold, which we guess to be 219 when FP is not a reasonable stack location. */ 220 221 // JRS 2002-sep-17: hack, to round up fp_max to the end of the 222 // current page, at least. Dunno if it helps. 223 // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again 224 fp_max = VG_PGROUNDUP(fp_max_orig); 225 if (fp_max >= sizeof(Addr)) 226 fp_max -= sizeof(Addr); 227 228 if (debug) 229 VG_(printf)("max_n_ips=%u fp_min=0x%08lx fp_max_orig=0x08%lx, " 230 "fp_max=0x%08lx ip=0x%08lx fp=0x%08lx\n", 231 max_n_ips, fp_min, fp_max_orig, fp_max, 232 uregs.xip, uregs.xbp); 233 234 /* Assertion broken before main() is reached in pthreaded programs; the 235 * offending stack traces only have one item. --njn, 2002-aug-16 */ 236 /* vg_assert(fp_min <= fp_max);*/ 237 // On Darwin, this kicks in for pthread-related stack traces, so they're 238 // only 1 entry long which is wrong. 239 # if defined(VGO_linux) 240 if (fp_min + 512 >= fp_max) { 241 /* If the stack limits look bogus, don't poke around ... but 242 don't bomb out either. */ 243 # elif defined(VGO_solaris) 244 if (fp_max == 0) { 245 /* VG_(get_StackTrace)() can be called by tools very early when 246 various tracing options are enabled. Don't proceed further 247 if the stack limits look bogus. 248 */ 249 # endif 250 # if defined(VGO_linux) || defined(VGO_solaris) 251 if (sps) sps[0] = uregs.xsp; 252 if (fps) fps[0] = uregs.xbp; 253 ips[0] = uregs.xip; 254 return 1; 255 } 256 # endif 257 258 if (UNLIKELY (fp_CF_verif_generation != VG_(debuginfo_generation)())) { 259 fp_CF_verif_generation = VG_(debuginfo_generation)(); 260 VG_(memset)(&fp_CF_verif_cache, 0, sizeof(fp_CF_verif_cache)); 261 FPO_info_present = VG_(FPO_info_present)(); 262 } 263 264 265 /* Loop unwinding the stack. Note that the IP value we get on 266 * each pass (whether from CFI info or a stack frame) is a 267 * return address so is actually after the calling instruction 268 * in the calling function. 269 * 270 * Because of this we subtract one from the IP after each pass 271 * of the loop so that we find the right CFI block on the next 272 * pass - otherwise we can find the wrong CFI info if it happens 273 * to change after the calling instruction and that will mean 274 * that we will fail to unwind the next step. 275 * 276 * This most frequently happens at the end of a function when 277 * a tail call occurs and we wind up using the CFI info for the 278 * next function which is completely wrong. 279 */ 280 if (sps) sps[0] = uregs.xsp; 281 if (fps) fps[0] = uregs.xbp; 282 ips[0] = uregs.xip; 283 i = 1; 284 if (do_stats) stats.nr++; 285 286 while (True) { 287 288 if (i >= max_n_ips) 289 break; 290 291 UWord hash = uregs.xip % N_FP_CF_VERIF; 292 Addr xip_verif = uregs.xip ^ fp_CF_verif_cache [hash]; 293 if (debug) 294 VG_(printf)(" uregs.xip 0x%08lx xip_verif[0x%08lx]" 295 " xbp 0x%08lx xsp 0x%08lx\n", 296 uregs.xip, xip_verif, 297 uregs.xbp, uregs.xsp); 298 // If xip is in cache, then xip_verif will be <= CFUNWIND. 299 // Otherwise, if not in cache, xip_verif will be > CFUNWIND. 300 301 /* Try to derive a new (ip,sp,fp) triple from the current set. */ 302 303 /* Do we have to do CFI unwinding ? 304 We do CFI unwinding if one of the following condition holds: 305 a. fp_CF_verif_cache contains xip but indicates CFUNWIND must 306 be done (i.e. fp unwind check failed when we did the first 307 unwind for this IP). 308 b. fp_CF_verif_cache does not contain xip. 309 We will try CFI unwinding in fpverif_uregs and compare with 310 FP unwind result to insert xip in the cache with the correct 311 indicator. */ 312 if (UNLIKELY(xip_verif >= CFUNWIND)) { 313 if (xip_verif == CFUNWIND) { 314 /* case a : do "real" cfi unwind */ 315 if ( VG_(use_CF_info)( &uregs, fp_min, fp_max ) ) { 316 if (debug) unwind_case = "Ca"; 317 if (do_stats) stats.Ca++; 318 goto unwind_done; 319 } 320 /* ??? cache indicates we have to do CFI unwind (so, we 321 previously found CFI info, and failed the fp unwind 322 check). Now, we just failed with CFI. So, once we 323 succeed, once we fail. No idea what is going on => 324 cleanup the cache entry and fallover to fp unwind (this 325 time). */ 326 fp_CF_verif_cache [hash] = 0; 327 if (debug) VG_(printf)(" cache reset as CFI ok then nok\n"); 328 //??? stats 329 xip_verif = NOINFO; 330 } else { 331 /* case b : do "verif" cfi unwind in fpverif_uregs */ 332 fpverif_uregs = uregs; 333 xip_verified = uregs.xip; 334 if ( !VG_(use_CF_info)( &fpverif_uregs, fp_min, fp_max ) ) { 335 fp_CF_verif_cache [hash] = uregs.xip ^ NOINFO; 336 if (debug) VG_(printf)(" cache NOINFO fpverif_uregs\n"); 337 xip_verif = NOINFO; 338 } 339 } 340 } 341 342 /* On x86, try the old-fashioned method of following the 343 %ebp-chain. This can be done if the fp_CF_verif_cache for xip 344 indicate fp unwind is ok. This must be done if the cache indicates 345 there is no info. This is also done to confirm what to put in the cache 346 if xip was not in the cache. */ 347 /* This deals with frames resulting from functions which begin "pushl% 348 ebp ; movl %esp, %ebp" which is the ABI-mandated preamble. */ 349 if (fp_min <= uregs.xbp && 350 uregs.xbp <= fp_max - 1 * sizeof(UWord)/*see comment below*/ && 351 VG_IS_4_ALIGNED(uregs.xbp)) 352 { 353 /* fp looks sane, so use it. */ 354 uregs.xip = (((UWord*)uregs.xbp)[1]); 355 // We stop if we hit a zero (the traditional end-of-stack 356 // marker) or a one -- these correspond to recorded IPs of 0 or -1. 357 // The latter because r8818 (in this file) changes the meaning of 358 // entries [1] and above in a stack trace, by subtracting 1 from 359 // them. Hence stacks that used to end with a zero value now end in 360 // -1 and so we must detect that too. 361 if (0 == uregs.xip || 1 == uregs.xip) { 362 if (xip_verif > CFUNWIND) { 363 // Check if we obtain the same result with fp unwind. 364 // If same result, then mark xip as fp unwindable 365 if (uregs.xip == fpverif_uregs.xip) { 366 fp_CF_verif_cache [hash] = xip_verified ^ FPUNWIND; 367 if (debug) VG_(printf)(" cache FPUNWIND 0\n"); 368 unwind_case = "Fw"; 369 if (do_stats) stats.Fw++; 370 break; 371 } else { 372 fp_CF_verif_cache [hash] = xip_verified ^ CFUNWIND; 373 uregs = fpverif_uregs; 374 if (debug) VG_(printf)(" cache CFUNWIND 0\n"); 375 unwind_case = "Cf"; 376 if (do_stats) stats.Cf++; 377 goto unwind_done; 378 } 379 } else { 380 // end of stack => out of the loop. 381 break; 382 } 383 } 384 385 uregs.xsp = uregs.xbp + sizeof(Addr) /*saved %ebp*/ 386 + sizeof(Addr) /*ra*/; 387 uregs.xbp = (((UWord*)uregs.xbp)[0]); 388 if (xip_verif > CFUNWIND) { 389 if (uregs.xip == fpverif_uregs.xip 390 && uregs.xsp == fpverif_uregs.xsp 391 && uregs.xbp == fpverif_uregs.xbp) { 392 fp_CF_verif_cache [hash] = xip_verified ^ FPUNWIND; 393 if (debug) VG_(printf)(" cache FPUNWIND >2\n"); 394 if (debug) unwind_case = "FO"; 395 if (do_stats) stats.FO++; 396 } else { 397 fp_CF_verif_cache [hash] = xip_verified ^ CFUNWIND; 398 if (debug) VG_(printf)(" cache CFUNWIND >2\n"); 399 if (do_stats && uregs.xip != fpverif_uregs.xip) stats.xi++; 400 if (do_stats && uregs.xsp != fpverif_uregs.xsp) stats.xs++; 401 if (do_stats && uregs.xbp != fpverif_uregs.xbp) stats.xb++; 402 uregs = fpverif_uregs; 403 if (debug) unwind_case = "CF"; 404 if (do_stats) stats.CF++; 405 } 406 } else { 407 if (debug) unwind_case = "FF"; 408 if (do_stats) stats.FF++; 409 } 410 goto unwind_done; 411 } else { 412 // fp unwind has failed. 413 // If we were checking the validity of the cfi unwinding, 414 // we mark in the cache that the fp unwind cannot be done, and that 415 // cfi unwind is desired. 416 if (xip_verif > CFUNWIND) { 417 // We know that fpverif_uregs contains valid information, 418 // as a failed cf unwind would have put NOINFO in xip_verif. 419 fp_CF_verif_cache [hash] = xip_verified ^ CFUNWIND; 420 if (debug) VG_(printf)(" cache CFUNWIND as fp failed\n"); 421 uregs = fpverif_uregs; 422 if (debug) unwind_case = "Ck"; 423 if (do_stats) stats.Ck++; 424 goto unwind_done; 425 } 426 // xip_verif is FPUNWIND or NOINFO. 427 // We failed the cfi unwind and/or the fp unwind. 428 // => fallback to FPO info. 429 } 430 431 /* And, similarly, try for MSVC FPO unwind info. */ 432 if (FPO_info_present 433 && VG_(use_FPO_info)( &uregs.xip, &uregs.xsp, &uregs.xbp, 434 fp_min, fp_max ) ) { 435 if (debug) unwind_case = "MS"; 436 if (do_stats) stats.MS++; 437 goto unwind_done; 438 } 439 440 /* No luck. We have to give up. */ 441 break; 442 443 unwind_done: 444 /* Add a frame in ips/sps/fps */ 445 /* fp is %ebp. sp is %esp. ip is %eip. */ 446 if (0 == uregs.xip || 1 == uregs.xip) break; 447 if (sps) sps[i] = uregs.xsp; 448 if (fps) fps[i] = uregs.xbp; 449 ips[i++] = uregs.xip - 1; 450 /* -1: refer to calling insn, not the RA */ 451 if (debug) 452 VG_(printf)(" ips%s[%d]=0x%08lx\n", unwind_case, i-1, ips[i-1]); 453 uregs.xip = uregs.xip - 1; 454 /* as per comment at the head of this loop */ 455 RECURSIVE_MERGE(cmrf,ips,i); 456 } 457 458 if (do_stats) stats.nf += i; 459 if (do_stats && stats.nr % 10000 == 0) { 460 VG_(printf)("nr %u nf %u " 461 "Ca %u FF %u " 462 "Cf %u " 463 "Fw %u FO %u " 464 "CF %u (xi %u xs %u xb %u) " 465 "Ck %u MS %u\n", 466 stats.nr, stats.nf, 467 stats.Ca, stats.FF, 468 stats.Cf, 469 stats.Fw, stats.FO, 470 stats.CF, stats.xi, stats.xs, stats.xb, 471 stats.Ck, stats.MS); 472 } 473 n_found = i; 474 return n_found; 475 } 476 477 #undef N_FP_CF_VERIF 478 #undef FPUNWIND 479 #undef NOINFO 480 #undef CFUNWIND 481 482 #endif 483 484 /* ----------------------- amd64 ------------------------ */ 485 486 #if defined(VGP_amd64_linux) || defined(VGP_amd64_darwin) \ 487 || defined(VGP_amd64_solaris) 488 489 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 490 /*OUT*/Addr* ips, UInt max_n_ips, 491 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 492 const UnwindStartRegs* startRegs, 493 Addr fp_max_orig ) 494 { 495 const Bool debug = False; 496 Int i; 497 Addr fp_max; 498 UInt n_found = 0; 499 const Int cmrf = VG_(clo_merge_recursive_frames); 500 501 vg_assert(sizeof(Addr) == sizeof(UWord)); 502 vg_assert(sizeof(Addr) == sizeof(void*)); 503 504 D3UnwindRegs uregs; 505 uregs.xip = startRegs->r_pc; 506 uregs.xsp = startRegs->r_sp; 507 uregs.xbp = startRegs->misc.AMD64.r_rbp; 508 Addr fp_min = uregs.xsp - VG_STACK_REDZONE_SZB; 509 510 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1], 511 stopping when the trail goes cold, which we guess to be 512 when FP is not a reasonable stack location. */ 513 514 // JRS 2002-sep-17: hack, to round up fp_max to the end of the 515 // current page, at least. Dunno if it helps. 516 // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again 517 fp_max = VG_PGROUNDUP(fp_max_orig); 518 if (fp_max >= sizeof(Addr)) 519 fp_max -= sizeof(Addr); 520 521 if (debug) 522 VG_(printf)("max_n_ips=%u fp_min=0x%lx fp_max_orig=0x%lx, " 523 "fp_max=0x%lx ip=0x%lx fp=0x%lx\n", 524 max_n_ips, fp_min, fp_max_orig, fp_max, 525 uregs.xip, uregs.xbp); 526 527 /* Assertion broken before main() is reached in pthreaded programs; the 528 * offending stack traces only have one item. --njn, 2002-aug-16 */ 529 /* vg_assert(fp_min <= fp_max);*/ 530 // On Darwin, this kicks in for pthread-related stack traces, so they're 531 // only 1 entry long which is wrong. 532 # if defined(VGO_linux) 533 if (fp_min + 256 >= fp_max) { 534 /* If the stack limits look bogus, don't poke around ... but 535 don't bomb out either. */ 536 # elif defined(VGO_solaris) 537 if (fp_max == 0) { 538 /* VG_(get_StackTrace)() can be called by tools very early when 539 various tracing options are enabled. Don't proceed further 540 if the stack limits look bogus. 541 */ 542 # endif 543 # if defined(VGO_linux) || defined(VGO_solaris) 544 545 if (sps) sps[0] = uregs.xsp; 546 if (fps) fps[0] = uregs.xbp; 547 ips[0] = uregs.xip; 548 return 1; 549 } 550 # endif 551 552 /* fp is %rbp. sp is %rsp. ip is %rip. */ 553 554 ips[0] = uregs.xip; 555 if (sps) sps[0] = uregs.xsp; 556 if (fps) fps[0] = uregs.xbp; 557 i = 1; 558 if (debug) 559 VG_(printf)(" ipsS[%d]=%#08lx rbp %#08lx rsp %#08lx\n", 560 i-1, ips[i-1], uregs.xbp, uregs.xsp); 561 562 # if defined(VGO_darwin) 563 if (VG_(is_valid_tid)(tid_if_known) && 564 VG_(is_in_syscall)(tid_if_known) && 565 i < max_n_ips) { 566 /* On Darwin, all the system call stubs have no function 567 * prolog. So instead of top of the stack being a new 568 * frame comprising a saved BP and a return address, we 569 * just have the return address in the caller's frame. 570 * Adjust for this by recording the return address. 571 */ 572 ips[i] = *(Addr *)uregs.xsp - 1; 573 if (sps) sps[i] = uregs.xsp; 574 if (fps) fps[i] = uregs.xbp; 575 i++; 576 } 577 # endif 578 579 /* Loop unwinding the stack. Note that the IP value we get on 580 * each pass (whether from CFI info or a stack frame) is a 581 * return address so is actually after the calling instruction 582 * in the calling function. 583 * 584 * Because of this we subtract one from the IP after each pass 585 * of the loop so that we find the right CFI block on the next 586 * pass - otherwise we can find the wrong CFI info if it happens 587 * to change after the calling instruction and that will mean 588 * that we will fail to unwind the next step. 589 * 590 * This most frequently happens at the end of a function when 591 * a tail call occurs and we wind up using the CFI info for the 592 * next function which is completely wrong. 593 */ 594 while (True) { 595 596 if (i >= max_n_ips) 597 break; 598 599 /* Try to derive a new (ip,sp,fp) triple from the current set. */ 600 601 /* First off, see if there is any CFI info to hand which can 602 be used. */ 603 if ( VG_(use_CF_info)( &uregs, fp_min, fp_max ) ) { 604 if (0 == uregs.xip || 1 == uregs.xip) break; 605 if (sps) sps[i] = uregs.xsp; 606 if (fps) fps[i] = uregs.xbp; 607 ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */ 608 if (debug) 609 VG_(printf)(" ipsC[%d]=%#08lx rbp %#08lx rsp %#08lx\n", 610 i-1, ips[i-1], uregs.xbp, uregs.xsp); 611 uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */ 612 RECURSIVE_MERGE(cmrf,ips,i); 613 continue; 614 } 615 616 /* If VG_(use_CF_info) fails, it won't modify ip/sp/fp, so 617 we can safely try the old-fashioned method. */ 618 /* This bit is supposed to deal with frames resulting from 619 functions which begin "pushq %rbp ; movq %rsp, %rbp". 620 Unfortunately, since we can't (easily) look at the insns at 621 the start of the fn, like GDB does, there's no reliable way 622 to tell. Hence the hack of first trying out CFI, and if that 623 fails, then use this as a fallback. */ 624 /* Note: re "- 1 * sizeof(UWord)", need to take account of the 625 fact that we are prodding at & ((UWord*)fp)[1] and so need to 626 adjust the limit check accordingly. Omitting this has been 627 observed to cause segfaults on rare occasions. */ 628 if (fp_min <= uregs.xbp && uregs.xbp <= fp_max - 1 * sizeof(UWord)) { 629 /* fp looks sane, so use it. */ 630 uregs.xip = (((UWord*)uregs.xbp)[1]); 631 if (0 == uregs.xip || 1 == uregs.xip) break; 632 uregs.xsp = uregs.xbp + sizeof(Addr) /*saved %rbp*/ 633 + sizeof(Addr) /*ra*/; 634 uregs.xbp = (((UWord*)uregs.xbp)[0]); 635 if (sps) sps[i] = uregs.xsp; 636 if (fps) fps[i] = uregs.xbp; 637 ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */ 638 if (debug) 639 VG_(printf)(" ipsF[%d]=%#08lx rbp %#08lx rsp %#08lx\n", 640 i-1, ips[i-1], uregs.xbp, uregs.xsp); 641 uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */ 642 RECURSIVE_MERGE(cmrf,ips,i); 643 continue; 644 } 645 646 /* Last-ditch hack (evidently GDB does something similar). We 647 are in the middle of nowhere and we have a nonsense value for 648 the frame pointer. If the stack pointer is still valid, 649 assume that what it points at is a return address. Yes, 650 desperate measures. Could do better here: 651 - check that the supposed return address is in 652 an executable page 653 - check that the supposed return address is just after a call insn 654 - given those two checks, don't just consider *sp as the return 655 address; instead scan a likely section of stack (eg sp .. sp+256) 656 and use suitable values found there. 657 */ 658 if (fp_min <= uregs.xsp && uregs.xsp < fp_max) { 659 uregs.xip = ((UWord*)uregs.xsp)[0]; 660 if (0 == uregs.xip || 1 == uregs.xip) break; 661 if (sps) sps[i] = uregs.xsp; 662 if (fps) fps[i] = uregs.xbp; 663 ips[i++] = uregs.xip == 0 664 ? 0 /* sp[0] == 0 ==> stuck at the bottom of a 665 thread stack */ 666 : uregs.xip - 1; 667 /* -1: refer to calling insn, not the RA */ 668 if (debug) 669 VG_(printf)(" ipsH[%d]=%#08lx\n", i-1, ips[i-1]); 670 uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */ 671 uregs.xsp += 8; 672 RECURSIVE_MERGE(cmrf,ips,i); 673 continue; 674 } 675 676 /* No luck at all. We have to give up. */ 677 break; 678 } 679 680 n_found = i; 681 return n_found; 682 } 683 684 #endif 685 686 /* -----------------------ppc32/64 ---------------------- */ 687 688 #if defined(VGP_ppc32_linux) || defined(VGP_ppc64be_linux) \ 689 || defined(VGP_ppc64le_linux) 690 691 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 692 /*OUT*/Addr* ips, UInt max_n_ips, 693 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 694 const UnwindStartRegs* startRegs, 695 Addr fp_max_orig ) 696 { 697 Bool lr_is_first_RA = False; 698 # if defined(VG_PLAT_USES_PPCTOC) || defined(VGP_ppc64le_linux) 699 Word redir_stack_size = 0; 700 Word redirs_used = 0; 701 # endif 702 const Int cmrf = VG_(clo_merge_recursive_frames); 703 704 Bool debug = False; 705 Int i; 706 Addr fp_max; 707 UInt n_found = 0; 708 709 vg_assert(sizeof(Addr) == sizeof(UWord)); 710 vg_assert(sizeof(Addr) == sizeof(void*)); 711 712 Addr ip = (Addr)startRegs->r_pc; 713 Addr sp = (Addr)startRegs->r_sp; 714 Addr fp = sp; 715 # if defined(VGP_ppc32_linux) 716 Addr lr = startRegs->misc.PPC32.r_lr; 717 # elif defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux) 718 Addr lr = startRegs->misc.PPC64.r_lr; 719 # endif 720 Addr fp_min = sp - VG_STACK_REDZONE_SZB; 721 722 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1], 723 stopping when the trail goes cold, which we guess to be 724 when FP is not a reasonable stack location. */ 725 726 // JRS 2002-sep-17: hack, to round up fp_max to the end of the 727 // current page, at least. Dunno if it helps. 728 // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again 729 fp_max = VG_PGROUNDUP(fp_max_orig); 730 if (fp_max >= sizeof(Addr)) 731 fp_max -= sizeof(Addr); 732 733 if (debug) 734 VG_(printf)("max_n_ips=%u fp_min=0x%lx fp_max_orig=0x%lx, " 735 "fp_max=0x%lx ip=0x%lx fp=0x%lx\n", 736 max_n_ips, fp_min, fp_max_orig, fp_max, ip, fp); 737 738 /* Assertion broken before main() is reached in pthreaded programs; the 739 * offending stack traces only have one item. --njn, 2002-aug-16 */ 740 /* vg_assert(fp_min <= fp_max);*/ 741 if (fp_min + 512 >= fp_max) { 742 /* If the stack limits look bogus, don't poke around ... but 743 don't bomb out either. */ 744 if (sps) sps[0] = sp; 745 if (fps) fps[0] = fp; 746 ips[0] = ip; 747 return 1; 748 } 749 750 /* fp is %r1. ip is %cia. Note, ppc uses r1 as both the stack and 751 frame pointers. */ 752 753 # if defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux) 754 redir_stack_size = VEX_GUEST_PPC64_REDIR_STACK_SIZE; 755 redirs_used = 0; 756 # endif 757 758 # if defined(VG_PLAT_USES_PPCTOC) || defined (VGP_ppc64le_linux) 759 /* Deal with bogus LR values caused by function 760 interception/wrapping on ppc-TOC platforms; see comment on 761 similar code a few lines further down. */ 762 if (lr == (Addr)&VG_(ppctoc_magic_redirect_return_stub) 763 && VG_(is_valid_tid)(tid_if_known)) { 764 Word hsp = VG_(threads)[tid_if_known].arch.vex.guest_REDIR_SP; 765 redirs_used++; 766 if (hsp >= 1 && hsp < redir_stack_size) 767 lr = VG_(threads)[tid_if_known] 768 .arch.vex.guest_REDIR_STACK[hsp-1]; 769 } 770 # endif 771 772 /* We have to determine whether or not LR currently holds this fn 773 (call it F)'s return address. It might not if F has previously 774 called some other function, hence overwriting LR with a pointer 775 to some part of F. Hence if LR and IP point to the same 776 function then we conclude LR does not hold this function's 777 return address; instead the LR at entry must have been saved in 778 the stack by F's prologue and so we must get it from there 779 instead. Note all this guff only applies to the innermost 780 frame. */ 781 lr_is_first_RA = False; 782 { 783 const HChar *buf_lr, *buf_ip; 784 /* The following conditional looks grossly inefficient and 785 surely could be majorly improved, with not much effort. */ 786 if (VG_(get_fnname_raw) (lr, &buf_lr)) { 787 HChar buf_lr_copy[VG_(strlen)(buf_lr) + 1]; 788 VG_(strcpy)(buf_lr_copy, buf_lr); 789 if (VG_(get_fnname_raw) (ip, &buf_ip)) 790 if (VG_(strcmp)(buf_lr_copy, buf_ip)) 791 lr_is_first_RA = True; 792 } 793 } 794 795 if (sps) sps[0] = fp; /* NB. not sp */ 796 if (fps) fps[0] = fp; 797 ips[0] = ip; 798 i = 1; 799 800 if (fp_min <= fp && fp < fp_max-VG_WORDSIZE+1) { 801 802 /* initial FP is sane; keep going */ 803 fp = (((UWord*)fp)[0]); 804 805 while (True) { 806 807 /* On ppc64-linux (ppc64-elf, really), the lr save 808 slot is 2 words back from sp, whereas on ppc32-elf(?) it's 809 only one word back. */ 810 # if defined(VG_PLAT_USES_PPCTOC) || defined(VGP_ppc64le_linux) 811 const Int lr_offset = 2; 812 # else 813 const Int lr_offset = 1; 814 # endif 815 816 if (i >= max_n_ips) 817 break; 818 819 /* Try to derive a new (ip,fp) pair from the current set. */ 820 821 if (fp_min <= fp && fp <= fp_max - lr_offset * sizeof(UWord)) { 822 /* fp looks sane, so use it. */ 823 824 if (i == 1 && lr_is_first_RA) 825 ip = lr; 826 else 827 ip = (((UWord*)fp)[lr_offset]); 828 829 # if defined(VG_PLAT_USES_PPCTOC) || defined(VGP_ppc64le_linux) 830 /* Nasty hack to do with function replacement/wrapping on 831 ppc64-linux. If LR points to our magic return stub, 832 then we are in a wrapped or intercepted function, in 833 which LR has been messed with. The original LR will 834 have been pushed onto the thread's hidden REDIR stack 835 one down from the top (top element is the saved R2) and 836 so we should restore the value from there instead. 837 Since nested redirections can and do happen, we keep 838 track of the number of nested LRs used by the unwinding 839 so far with 'redirs_used'. */ 840 if (ip == (Addr)&VG_(ppctoc_magic_redirect_return_stub) 841 && VG_(is_valid_tid)(tid_if_known)) { 842 Word hsp = VG_(threads)[tid_if_known] 843 .arch.vex.guest_REDIR_SP; 844 hsp -= 2 * redirs_used; 845 redirs_used ++; 846 if (hsp >= 1 && hsp < redir_stack_size) 847 ip = VG_(threads)[tid_if_known] 848 .arch.vex.guest_REDIR_STACK[hsp-1]; 849 } 850 # endif 851 852 if (0 == ip || 1 == ip) break; 853 if (sps) sps[i] = fp; /* NB. not sp */ 854 if (fps) fps[i] = fp; 855 fp = (((UWord*)fp)[0]); 856 ips[i++] = ip - 1; /* -1: refer to calling insn, not the RA */ 857 if (debug) 858 VG_(printf)(" ipsF[%d]=%#08lx\n", i-1, ips[i-1]); 859 ip = ip - 1; /* ip is probably dead at this point, but 860 play safe, a la x86/amd64 above. See 861 extensive comments above. */ 862 RECURSIVE_MERGE(cmrf,ips,i); 863 continue; 864 } 865 866 /* No luck there. We have to give up. */ 867 break; 868 } 869 } 870 871 n_found = i; 872 return n_found; 873 } 874 875 #endif 876 877 /* ------------------------ arm ------------------------- */ 878 879 #if defined(VGP_arm_linux) 880 881 static Bool in_same_fn ( Addr a1, Addr a2 ) 882 { 883 const HChar *buf_a1, *buf_a2; 884 /* The following conditional looks grossly inefficient and 885 surely could be majorly improved, with not much effort. */ 886 if (VG_(get_fnname_raw) (a1, &buf_a1)) { 887 HChar buf_a1_copy[VG_(strlen)(buf_a1) + 1]; 888 VG_(strcpy)(buf_a1_copy, buf_a1); 889 if (VG_(get_fnname_raw) (a2, &buf_a2)) 890 if (VG_(strcmp)(buf_a1_copy, buf_a2)) 891 return True; 892 } 893 return False; 894 } 895 896 static Bool in_same_page ( Addr a1, Addr a2 ) { 897 return (a1 & ~0xFFF) == (a2 & ~0xFFF); 898 } 899 900 static Addr abs_diff ( Addr a1, Addr a2 ) { 901 return (Addr)(a1 > a2 ? a1 - a2 : a2 - a1); 902 } 903 904 static Bool has_XT_perms ( Addr a ) 905 { 906 NSegment const* seg = VG_(am_find_nsegment)(a); 907 return seg && seg->hasX && seg->hasT; 908 } 909 910 static Bool looks_like_Thumb_call32 ( UShort w0, UShort w1 ) 911 { 912 if (0) 913 VG_(printf)("isT32call %04x %04x\n", (UInt)w0, (UInt)w1); 914 // BL simm26 915 if ((w0 & 0xF800) == 0xF000 && (w1 & 0xC000) == 0xC000) return True; 916 // BLX simm26 917 if ((w0 & 0xF800) == 0xF000 && (w1 & 0xC000) == 0xC000) return True; 918 return False; 919 } 920 921 static Bool looks_like_Thumb_call16 ( UShort w0 ) 922 { 923 return False; 924 } 925 926 static Bool looks_like_ARM_call ( UInt a0 ) 927 { 928 if (0) 929 VG_(printf)("isA32call %08x\n", a0); 930 // Leading E forces unconditional only -- fix 931 if ((a0 & 0xFF000000) == 0xEB000000) return True; 932 return False; 933 } 934 935 static Bool looks_like_RA ( Addr ra ) 936 { 937 /* 'ra' is a plausible return address if it points to 938 an instruction after a call insn. */ 939 Bool isT = (ra & 1); 940 if (isT) { 941 // returning to Thumb code 942 ra &= ~1; 943 ra -= 4; 944 if (has_XT_perms(ra)) { 945 UShort w0 = *(UShort*)ra; 946 UShort w1 = in_same_page(ra, ra+2) ? *(UShort*)(ra+2) : 0; 947 if (looks_like_Thumb_call16(w1) || looks_like_Thumb_call32(w0,w1)) 948 return True; 949 } 950 } else { 951 // ARM 952 ra &= ~3; 953 ra -= 4; 954 if (has_XT_perms(ra)) { 955 UInt a0 = *(UInt*)ra; 956 if (looks_like_ARM_call(a0)) 957 return True; 958 } 959 } 960 return False; 961 } 962 963 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 964 /*OUT*/Addr* ips, UInt max_n_ips, 965 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 966 const UnwindStartRegs* startRegs, 967 Addr fp_max_orig ) 968 { 969 Bool debug = False; 970 Int i; 971 Addr fp_max; 972 UInt n_found = 0; 973 const Int cmrf = VG_(clo_merge_recursive_frames); 974 975 vg_assert(sizeof(Addr) == sizeof(UWord)); 976 vg_assert(sizeof(Addr) == sizeof(void*)); 977 978 D3UnwindRegs uregs; 979 uregs.r15 = startRegs->r_pc & 0xFFFFFFFE; 980 uregs.r14 = startRegs->misc.ARM.r14; 981 uregs.r13 = startRegs->r_sp; 982 uregs.r12 = startRegs->misc.ARM.r12; 983 uregs.r11 = startRegs->misc.ARM.r11; 984 uregs.r7 = startRegs->misc.ARM.r7; 985 Addr fp_min = uregs.r13 - VG_STACK_REDZONE_SZB; 986 987 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1], 988 stopping when the trail goes cold, which we guess to be 989 when FP is not a reasonable stack location. */ 990 991 // JRS 2002-sep-17: hack, to round up fp_max to the end of the 992 // current page, at least. Dunno if it helps. 993 // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again 994 fp_max = VG_PGROUNDUP(fp_max_orig); 995 if (fp_max >= sizeof(Addr)) 996 fp_max -= sizeof(Addr); 997 998 if (debug) 999 VG_(printf)("\nmax_n_ips=%u fp_min=0x%lx fp_max_orig=0x%lx, " 1000 "fp_max=0x%lx r15=0x%lx r13=0x%lx\n", 1001 max_n_ips, fp_min, fp_max_orig, fp_max, 1002 uregs.r15, uregs.r13); 1003 1004 /* Assertion broken before main() is reached in pthreaded programs; the 1005 * offending stack traces only have one item. --njn, 2002-aug-16 */ 1006 /* vg_assert(fp_min <= fp_max);*/ 1007 // On Darwin, this kicks in for pthread-related stack traces, so they're 1008 // only 1 entry long which is wrong. 1009 if (fp_min + 512 >= fp_max) { 1010 /* If the stack limits look bogus, don't poke around ... but 1011 don't bomb out either. */ 1012 if (sps) sps[0] = uregs.r13; 1013 if (fps) fps[0] = 0; 1014 ips[0] = uregs.r15; 1015 return 1; 1016 } 1017 1018 /* */ 1019 1020 if (sps) sps[0] = uregs.r13; 1021 if (fps) fps[0] = 0; 1022 ips[0] = uregs.r15; 1023 i = 1; 1024 1025 /* Loop unwinding the stack. */ 1026 Bool do_stack_scan = False; 1027 1028 /* First try the Official Way, using Dwarf CFI. */ 1029 while (True) { 1030 if (debug) { 1031 VG_(printf)("i: %d, r15: 0x%lx, r13: 0x%lx\n", 1032 i, uregs.r15, uregs.r13); 1033 } 1034 1035 if (i >= max_n_ips) 1036 break; 1037 1038 if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) { 1039 if (sps) sps[i] = uregs.r13; 1040 if (fps) fps[i] = 0; 1041 ips[i++] = (uregs.r15 & 0xFFFFFFFE) - 1; 1042 if (debug) 1043 VG_(printf)("USING CFI: r15: 0x%lx, r13: 0x%lx\n", 1044 uregs.r15, uregs.r13); 1045 uregs.r15 = (uregs.r15 & 0xFFFFFFFE) - 1; 1046 RECURSIVE_MERGE(cmrf,ips,i); 1047 continue; 1048 } 1049 1050 /* No luck. We have to give up. */ 1051 do_stack_scan = True; 1052 break; 1053 } 1054 1055 /* Now try Plan B (maybe) -- stack scanning. This often gives 1056 pretty bad results, so this has to be enabled explicitly by the 1057 user. */ 1058 if (do_stack_scan 1059 && i < max_n_ips && i < (Int)VG_(clo_unw_stack_scan_thresh)) { 1060 Int nByStackScan = 0; 1061 Addr lr = uregs.r14; 1062 Addr sp = uregs.r13 & ~3; 1063 Addr pc = uregs.r15; 1064 // First see if LR contains 1065 // something that could be a valid return address. 1066 if (!in_same_fn(lr, pc) && looks_like_RA(lr)) { 1067 // take it only if 'cand' isn't obviously a duplicate 1068 // of the last found IP value 1069 Addr cand = (lr & 0xFFFFFFFE) - 1; 1070 if (abs_diff(cand, ips[i-1]) > 1) { 1071 if (sps) sps[i] = 0; 1072 if (fps) fps[i] = 0; 1073 ips[i++] = cand; 1074 RECURSIVE_MERGE(cmrf,ips,i); 1075 nByStackScan++; 1076 } 1077 } 1078 while (in_same_page(sp, uregs.r13)) { 1079 if (i >= max_n_ips) 1080 break; 1081 // we're in the same page; fairly safe to keep going 1082 UWord w = *(UWord*)(sp & ~0x3); 1083 if (looks_like_RA(w)) { 1084 Addr cand = (w & 0xFFFFFFFE) - 1; 1085 // take it only if 'cand' isn't obviously a duplicate 1086 // of the last found IP value 1087 if (abs_diff(cand, ips[i-1]) > 1) { 1088 if (sps) sps[i] = 0; 1089 if (fps) fps[i] = 0; 1090 ips[i++] = cand; 1091 RECURSIVE_MERGE(cmrf,ips,i); 1092 if (++nByStackScan >= VG_(clo_unw_stack_scan_frames)) break; 1093 } 1094 } 1095 sp += 4; 1096 } 1097 } 1098 1099 n_found = i; 1100 return n_found; 1101 } 1102 1103 #endif 1104 1105 /* ------------------------ arm64 ------------------------- */ 1106 1107 #if defined(VGP_arm64_linux) 1108 1109 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 1110 /*OUT*/Addr* ips, UInt max_n_ips, 1111 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 1112 const UnwindStartRegs* startRegs, 1113 Addr fp_max_orig ) 1114 { 1115 Bool debug = False; 1116 Int i; 1117 Addr fp_max; 1118 UInt n_found = 0; 1119 const Int cmrf = VG_(clo_merge_recursive_frames); 1120 1121 vg_assert(sizeof(Addr) == sizeof(UWord)); 1122 vg_assert(sizeof(Addr) == sizeof(void*)); 1123 1124 D3UnwindRegs uregs; 1125 uregs.pc = startRegs->r_pc; 1126 uregs.sp = startRegs->r_sp; 1127 uregs.x30 = startRegs->misc.ARM64.x30; 1128 uregs.x29 = startRegs->misc.ARM64.x29; 1129 Addr fp_min = uregs.sp - VG_STACK_REDZONE_SZB; 1130 1131 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1], 1132 stopping when the trail goes cold, which we guess to be 1133 when FP is not a reasonable stack location. */ 1134 1135 // JRS 2002-sep-17: hack, to round up fp_max to the end of the 1136 // current page, at least. Dunno if it helps. 1137 // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again 1138 fp_max = VG_PGROUNDUP(fp_max_orig); 1139 if (fp_max >= sizeof(Addr)) 1140 fp_max -= sizeof(Addr); 1141 1142 if (debug) 1143 VG_(printf)("\nmax_n_ips=%u fp_min=0x%lx fp_max_orig=0x%lx, " 1144 "fp_max=0x%lx PC=0x%lx SP=0x%lx\n", 1145 max_n_ips, fp_min, fp_max_orig, fp_max, 1146 uregs.pc, uregs.sp); 1147 1148 /* Assertion broken before main() is reached in pthreaded programs; the 1149 * offending stack traces only have one item. --njn, 2002-aug-16 */ 1150 /* vg_assert(fp_min <= fp_max);*/ 1151 // On Darwin, this kicks in for pthread-related stack traces, so they're 1152 // only 1 entry long which is wrong. 1153 if (fp_min + 512 >= fp_max) { 1154 /* If the stack limits look bogus, don't poke around ... but 1155 don't bomb out either. */ 1156 if (sps) sps[0] = uregs.sp; 1157 if (fps) fps[0] = uregs.x29; 1158 ips[0] = uregs.pc; 1159 return 1; 1160 } 1161 1162 /* */ 1163 1164 if (sps) sps[0] = uregs.sp; 1165 if (fps) fps[0] = uregs.x29; 1166 ips[0] = uregs.pc; 1167 i = 1; 1168 1169 /* Loop unwinding the stack, using CFI. */ 1170 while (True) { 1171 if (debug) { 1172 VG_(printf)("i: %d, pc: 0x%lx, sp: 0x%lx\n", 1173 i, uregs.pc, uregs.sp); 1174 } 1175 1176 if (i >= max_n_ips) 1177 break; 1178 1179 if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) { 1180 if (sps) sps[i] = uregs.sp; 1181 if (fps) fps[i] = uregs.x29; 1182 ips[i++] = uregs.pc - 1; 1183 if (debug) 1184 VG_(printf)("USING CFI: pc: 0x%lx, sp: 0x%lx\n", 1185 uregs.pc, uregs.sp); 1186 uregs.pc = uregs.pc - 1; 1187 RECURSIVE_MERGE(cmrf,ips,i); 1188 continue; 1189 } 1190 1191 /* No luck. We have to give up. */ 1192 break; 1193 } 1194 1195 n_found = i; 1196 return n_found; 1197 } 1198 1199 #endif 1200 1201 /* ------------------------ s390x ------------------------- */ 1202 1203 #if defined(VGP_s390x_linux) 1204 1205 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 1206 /*OUT*/Addr* ips, UInt max_n_ips, 1207 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 1208 const UnwindStartRegs* startRegs, 1209 Addr fp_max_orig ) 1210 { 1211 Bool debug = False; 1212 Int i; 1213 Addr fp_max; 1214 UInt n_found = 0; 1215 const Int cmrf = VG_(clo_merge_recursive_frames); 1216 1217 vg_assert(sizeof(Addr) == sizeof(UWord)); 1218 vg_assert(sizeof(Addr) == sizeof(void*)); 1219 1220 D3UnwindRegs uregs; 1221 uregs.ia = startRegs->r_pc; 1222 uregs.sp = startRegs->r_sp; 1223 Addr fp_min = uregs.sp - VG_STACK_REDZONE_SZB; 1224 uregs.fp = startRegs->misc.S390X.r_fp; 1225 uregs.lr = startRegs->misc.S390X.r_lr; 1226 1227 fp_max = VG_PGROUNDUP(fp_max_orig); 1228 if (fp_max >= sizeof(Addr)) 1229 fp_max -= sizeof(Addr); 1230 1231 if (debug) 1232 VG_(printf)("max_n_ips=%u fp_min=0x%lx fp_max_orig=0x%lx, " 1233 "fp_max=0x%lx IA=0x%lx SP=0x%lx FP=0x%lx\n", 1234 max_n_ips, fp_min, fp_max_orig, fp_max, 1235 uregs.ia, uregs.sp,uregs.fp); 1236 1237 /* The first frame is pretty obvious */ 1238 ips[0] = uregs.ia; 1239 if (sps) sps[0] = uregs.sp; 1240 if (fps) fps[0] = uregs.fp; 1241 i = 1; 1242 1243 /* for everything else we have to rely on the eh_frame. gcc defaults to 1244 not create a backchain and all the other tools (like gdb) also have 1245 to use the CFI. */ 1246 while (True) { 1247 if (i >= max_n_ips) 1248 break; 1249 1250 if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) { 1251 if (sps) sps[i] = uregs.sp; 1252 if (fps) fps[i] = uregs.fp; 1253 ips[i++] = uregs.ia - 1; 1254 uregs.ia = uregs.ia - 1; 1255 RECURSIVE_MERGE(cmrf,ips,i); 1256 continue; 1257 } 1258 /* A problem on the first frame? Lets assume it was a bad jump. 1259 We will use the link register and the current stack and frame 1260 pointers and see if we can use the CFI in the next round. */ 1261 if (i == 1) { 1262 if (sps) { 1263 sps[i] = sps[0]; 1264 uregs.sp = sps[0]; 1265 } 1266 if (fps) { 1267 fps[i] = fps[0]; 1268 uregs.fp = fps[0]; 1269 } 1270 uregs.ia = uregs.lr - 1; 1271 ips[i++] = uregs.lr - 1; 1272 RECURSIVE_MERGE(cmrf,ips,i); 1273 continue; 1274 } 1275 1276 /* No luck. We have to give up. */ 1277 break; 1278 } 1279 1280 n_found = i; 1281 return n_found; 1282 } 1283 1284 #endif 1285 1286 /* ------------------------ mips 32/64 ------------------------- */ 1287 #if defined(VGP_mips32_linux) || defined(VGP_mips64_linux) 1288 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 1289 /*OUT*/Addr* ips, UInt max_n_ips, 1290 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 1291 const UnwindStartRegs* startRegs, 1292 Addr fp_max_orig ) 1293 { 1294 Bool debug = False; 1295 Int i; 1296 Addr fp_max; 1297 UInt n_found = 0; 1298 const Int cmrf = VG_(clo_merge_recursive_frames); 1299 1300 vg_assert(sizeof(Addr) == sizeof(UWord)); 1301 vg_assert(sizeof(Addr) == sizeof(void*)); 1302 1303 D3UnwindRegs uregs; 1304 uregs.pc = startRegs->r_pc; 1305 uregs.sp = startRegs->r_sp; 1306 Addr fp_min = uregs.sp - VG_STACK_REDZONE_SZB; 1307 1308 #if defined(VGP_mips32_linux) 1309 uregs.fp = startRegs->misc.MIPS32.r30; 1310 uregs.ra = startRegs->misc.MIPS32.r31; 1311 #elif defined(VGP_mips64_linux) 1312 uregs.fp = startRegs->misc.MIPS64.r30; 1313 uregs.ra = startRegs->misc.MIPS64.r31; 1314 #endif 1315 1316 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1], 1317 stopping when the trail goes cold, which we guess to be 1318 when FP is not a reasonable stack location. */ 1319 1320 fp_max = VG_PGROUNDUP(fp_max_orig); 1321 if (fp_max >= sizeof(Addr)) 1322 fp_max -= sizeof(Addr); 1323 1324 if (debug) 1325 VG_(printf)("max_n_ips=%u fp_min=0x%lx fp_max_orig=0x%lx, " 1326 "fp_max=0x%lx pc=0x%lx sp=0x%lx fp=0x%lx\n", 1327 max_n_ips, fp_min, fp_max_orig, fp_max, 1328 uregs.pc, uregs.sp, uregs.fp); 1329 1330 if (sps) sps[0] = uregs.sp; 1331 if (fps) fps[0] = uregs.fp; 1332 ips[0] = uregs.pc; 1333 i = 1; 1334 1335 /* Loop unwinding the stack. */ 1336 1337 while (True) { 1338 if (debug) { 1339 VG_(printf)("i: %d, pc: 0x%lx, sp: 0x%lx, ra: 0x%lx\n", 1340 i, uregs.pc, uregs.sp, uregs.ra); 1341 } 1342 if (i >= max_n_ips) 1343 break; 1344 1345 D3UnwindRegs uregs_copy = uregs; 1346 if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) { 1347 if (debug) 1348 VG_(printf)("USING CFI: pc: 0x%lx, sp: 0x%lx, ra: 0x%lx\n", 1349 uregs.pc, uregs.sp, uregs.ra); 1350 if (0 != uregs.pc && 1 != uregs.pc) { 1351 if (sps) sps[i] = uregs.sp; 1352 if (fps) fps[i] = uregs.fp; 1353 ips[i++] = uregs.pc - 4; 1354 uregs.pc = uregs.pc - 4; 1355 RECURSIVE_MERGE(cmrf,ips,i); 1356 continue; 1357 } else 1358 uregs = uregs_copy; 1359 } 1360 1361 int seen_sp_adjust = 0; 1362 long frame_offset = 0; 1363 PtrdiffT offset; 1364 if (VG_(get_inst_offset_in_function)(uregs.pc, &offset)) { 1365 Addr start_pc = uregs.pc - offset; 1366 Addr limit_pc = uregs.pc; 1367 Addr cur_pc; 1368 for (cur_pc = start_pc; cur_pc < limit_pc; cur_pc += 4) { 1369 unsigned long inst, high_word, low_word; 1370 unsigned long * cur_inst; 1371 /* Fetch the instruction. */ 1372 cur_inst = (unsigned long *)cur_pc; 1373 inst = *((UInt *) cur_inst); 1374 if(debug) 1375 VG_(printf)("cur_pc: 0x%lx, inst: 0x%lx\n", cur_pc, inst); 1376 1377 /* Save some code by pre-extracting some useful fields. */ 1378 high_word = (inst >> 16) & 0xffff; 1379 low_word = inst & 0xffff; 1380 1381 if (high_word == 0x27bd /* addiu $sp,$sp,-i */ 1382 || high_word == 0x23bd /* addi $sp,$sp,-i */ 1383 || high_word == 0x67bd) { /* daddiu $sp,$sp,-i */ 1384 if (low_word & 0x8000) /* negative stack adjustment? */ 1385 frame_offset += 0x10000 - low_word; 1386 else 1387 /* Exit loop if a positive stack adjustment is found, which 1388 usually means that the stack cleanup code in the function 1389 epilogue is reached. */ 1390 break; 1391 seen_sp_adjust = 1; 1392 } 1393 } 1394 if(debug) 1395 VG_(printf)("offset: 0x%lx\n", frame_offset); 1396 } 1397 if (seen_sp_adjust) { 1398 if (0 == uregs.pc || 1 == uregs.pc) break; 1399 if (uregs.pc == uregs.ra - 8) break; 1400 if (sps) { 1401 sps[i] = uregs.sp + frame_offset; 1402 } 1403 uregs.sp = uregs.sp + frame_offset; 1404 1405 if (fps) { 1406 fps[i] = fps[0]; 1407 uregs.fp = fps[0]; 1408 } 1409 if (0 == uregs.ra || 1 == uregs.ra) break; 1410 uregs.pc = uregs.ra - 8; 1411 ips[i++] = uregs.ra - 8; 1412 RECURSIVE_MERGE(cmrf,ips,i); 1413 continue; 1414 } 1415 1416 if (i == 1) { 1417 if (sps) { 1418 sps[i] = sps[0]; 1419 uregs.sp = sps[0]; 1420 } 1421 if (fps) { 1422 fps[i] = fps[0]; 1423 uregs.fp = fps[0]; 1424 } 1425 if (0 == uregs.ra || 1 == uregs.ra) break; 1426 uregs.pc = uregs.ra - 8; 1427 ips[i++] = uregs.ra - 8; 1428 RECURSIVE_MERGE(cmrf,ips,i); 1429 continue; 1430 } 1431 /* No luck. We have to give up. */ 1432 break; 1433 } 1434 1435 n_found = i; 1436 return n_found; 1437 } 1438 1439 #endif 1440 1441 /* ------------------------ tilegx ------------------------- */ 1442 #if defined(VGP_tilegx_linux) 1443 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 1444 /*OUT*/Addr* ips, UInt max_n_ips, 1445 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 1446 const UnwindStartRegs* startRegs, 1447 Addr fp_max_orig ) 1448 { 1449 Bool debug = False; 1450 Int i; 1451 Addr fp_max; 1452 UInt n_found = 0; 1453 const Int cmrf = VG_(clo_merge_recursive_frames); 1454 1455 vg_assert(sizeof(Addr) == sizeof(UWord)); 1456 vg_assert(sizeof(Addr) == sizeof(void*)); 1457 1458 D3UnwindRegs uregs; 1459 uregs.pc = startRegs->r_pc; 1460 uregs.sp = startRegs->r_sp; 1461 Addr fp_min = uregs.sp - VG_STACK_REDZONE_SZB; 1462 1463 uregs.fp = startRegs->misc.TILEGX.r52; 1464 uregs.lr = startRegs->misc.TILEGX.r55; 1465 1466 fp_max = VG_PGROUNDUP(fp_max_orig); 1467 if (fp_max >= sizeof(Addr)) 1468 fp_max -= sizeof(Addr); 1469 1470 if (debug) 1471 VG_(printf)("max_n_ips=%u fp_min=0x%lx fp_max_orig=0x%lx, " 1472 "fp_max=0x%lx pc=0x%lx sp=0x%lx fp=0x%lx\n", 1473 max_n_ips, fp_min, fp_max_orig, fp_max, 1474 uregs.pc, uregs.sp, uregs.fp); 1475 1476 if (sps) sps[0] = uregs.sp; 1477 if (fps) fps[0] = uregs.fp; 1478 ips[0] = uregs.pc; 1479 i = 1; 1480 1481 /* Loop unwinding the stack. */ 1482 while (True) { 1483 if (debug) { 1484 VG_(printf)("i: %d, pc: 0x%lx, sp: 0x%lx, lr: 0x%lx\n", 1485 i, uregs.pc, uregs.sp, uregs.lr); 1486 } 1487 if (i >= max_n_ips) 1488 break; 1489 1490 D3UnwindRegs uregs_copy = uregs; 1491 if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) { 1492 if (debug) 1493 VG_(printf)("USING CFI: pc: 0x%lx, sp: 0x%lx, fp: 0x%lx, lr: 0x%lx\n", 1494 uregs.pc, uregs.sp, uregs.fp, uregs.lr); 1495 if (0 != uregs.pc && 1 != uregs.pc && 1496 (uregs.pc < fp_min || uregs.pc > fp_max)) { 1497 if (sps) sps[i] = uregs.sp; 1498 if (fps) fps[i] = uregs.fp; 1499 if (uregs.pc != uregs_copy.pc && uregs.sp != uregs_copy.sp) 1500 ips[i++] = uregs.pc - 8; 1501 uregs.pc = uregs.pc - 8; 1502 RECURSIVE_MERGE(cmrf,ips,i); 1503 continue; 1504 } else 1505 uregs = uregs_copy; 1506 } 1507 1508 Long frame_offset = 0; 1509 PtrdiffT offset; 1510 if (VG_(get_inst_offset_in_function)(uregs.pc, &offset)) { 1511 Addr start_pc = uregs.pc; 1512 Addr limit_pc = uregs.pc - offset; 1513 Addr cur_pc; 1514 /* Try to find any stack adjustment from current instruction 1515 bundles downward. */ 1516 for (cur_pc = start_pc; cur_pc > limit_pc; cur_pc -= 8) { 1517 ULong inst; 1518 Long off = 0; 1519 ULong* cur_inst; 1520 /* Fetch the instruction. */ 1521 cur_inst = (ULong *)cur_pc; 1522 inst = *cur_inst; 1523 if(debug) 1524 VG_(printf)("cur_pc: 0x%lx, inst: 0x%lx\n", cur_pc, inst); 1525 1526 if ((inst & 0xC000000000000000ULL) == 0) { 1527 /* Bundle is X type. */ 1528 if ((inst & 0xC000000070000fffULL) == 1529 (0x0000000010000db6ULL)) { 1530 /* addli at X0 */ 1531 off = (short)(0xFFFF & (inst >> 12)); 1532 } else if ((inst & 0xF80007ff80000000ULL) == 1533 (0x000006db00000000ULL)) { 1534 /* addli at X1 addli*/ 1535 off = (short)(0xFFFF & (inst >> 43)); 1536 } else if ((inst & 0xC00000007FF00FFFULL) == 1537 (0x0000000040100db6ULL)) { 1538 /* addi at X0 */ 1539 off = (char)(0xFF & (inst >> 12)); 1540 } else if ((inst & 0xFFF807ff80000000ULL) == 1541 (0x180806db00000000ULL)) { 1542 /* addi at X1 */ 1543 off = (char)(0xFF & (inst >> 43)); 1544 } 1545 } else { 1546 /* Bundle is Y type. */ 1547 if ((inst & 0x0000000078000FFFULL) == 1548 (0x0000000000000db6ULL)) { 1549 /* addi at Y0 */ 1550 off = (char)(0xFF & (inst >> 12)); 1551 } else if ((inst & 0x3C0007FF80000000ULL) == 1552 (0x040006db00000000ULL)) { 1553 /* addi at Y1 */ 1554 off = (char)(0xFF & (inst >> 43)); 1555 } 1556 } 1557 1558 if(debug && off) 1559 VG_(printf)("offset: -0x%lx\n", -off); 1560 1561 if (off < 0) { 1562 /* frame offset should be modular of 8 */ 1563 vg_assert((off & 7) == 0); 1564 frame_offset += off; 1565 } else if (off > 0) 1566 /* Exit loop if a positive stack adjustment is found, which 1567 usually means that the stack cleanup code in the function 1568 epilogue is reached. */ 1569 break; 1570 } 1571 } 1572 1573 if (frame_offset < 0) { 1574 if (0 == uregs.pc || 1 == uregs.pc) break; 1575 1576 /* Subtract the offset from the current stack. */ 1577 uregs.sp = uregs.sp + (ULong)(-frame_offset); 1578 1579 if (debug) 1580 VG_(printf)("offset: i: %d, pc: 0x%lx, sp: 0x%lx, lr: 0x%lx\n", 1581 i, uregs.pc, uregs.sp, uregs.lr); 1582 1583 if (uregs.pc == uregs.lr - 8 || 1584 uregs.lr - 8 >= fp_min && uregs.lr - 8 <= fp_max) { 1585 if (debug) 1586 VG_(printf)("new lr = 0x%lx\n", *(ULong*)uregs.sp); 1587 uregs.lr = *(ULong*)uregs.sp; 1588 } 1589 1590 uregs.pc = uregs.lr - 8; 1591 1592 if (uregs.lr != 0) { 1593 /* Avoid the invalid pc = 0xffff...ff8 */ 1594 if (sps) 1595 sps[i] = uregs.sp; 1596 1597 if (fps) 1598 fps[i] = fps[0]; 1599 1600 ips[i++] = uregs.pc; 1601 1602 RECURSIVE_MERGE(cmrf,ips,i); 1603 } 1604 continue; 1605 } 1606 1607 /* A special case for the 1st frame. Assume it was a bad jump. 1608 Use the link register "lr" and current stack and frame to 1609 try again. */ 1610 if (i == 1) { 1611 if (sps) { 1612 sps[1] = sps[0]; 1613 uregs.sp = sps[0]; 1614 } 1615 if (fps) { 1616 fps[1] = fps[0]; 1617 uregs.fp = fps[0]; 1618 } 1619 if (0 == uregs.lr || 1 == uregs.lr) 1620 break; 1621 1622 uregs.pc = uregs.lr - 8; 1623 ips[i++] = uregs.lr - 8; 1624 RECURSIVE_MERGE(cmrf,ips,i); 1625 continue; 1626 } 1627 /* No luck. We have to give up. */ 1628 break; 1629 } 1630 1631 if (debug) { 1632 /* Display the back trace. */ 1633 Int ii ; 1634 for ( ii = 0; ii < i; ii++) { 1635 if (sps) { 1636 VG_(printf)("%d: pc=%lx ", ii, ips[ii]); 1637 VG_(printf)("sp=%lx\n", sps[ii]); 1638 } else { 1639 VG_(printf)("%d: pc=%lx\n", ii, ips[ii]); 1640 } 1641 } 1642 } 1643 1644 n_found = i; 1645 return n_found; 1646 } 1647 #endif 1648 1649 /*------------------------------------------------------------*/ 1650 /*--- ---*/ 1651 /*--- END platform-dependent unwinder worker functions ---*/ 1652 /*--- ---*/ 1653 /*------------------------------------------------------------*/ 1654 1655 /*------------------------------------------------------------*/ 1656 /*--- Exported functions. ---*/ 1657 /*------------------------------------------------------------*/ 1658 1659 UInt VG_(get_StackTrace) ( ThreadId tid, 1660 /*OUT*/StackTrace ips, UInt max_n_ips, 1661 /*OUT*/StackTrace sps, 1662 /*OUT*/StackTrace fps, 1663 Word first_ip_delta ) 1664 { 1665 /* Get the register values with which to start the unwind. */ 1666 UnwindStartRegs startRegs; 1667 VG_(memset)( &startRegs, 0, sizeof(startRegs) ); 1668 VG_(get_UnwindStartRegs)( &startRegs, tid ); 1669 1670 Addr stack_highest_byte = VG_(threads)[tid].client_stack_highest_byte; 1671 Addr stack_lowest_byte = 0; 1672 1673 # if defined(VGP_x86_linux) 1674 /* Nasty little hack to deal with syscalls - if libc is using its 1675 _dl_sysinfo_int80 function for syscalls (the TLS version does), 1676 then ip will always appear to be in that function when doing a 1677 syscall, not the actual libc function doing the syscall. This 1678 check sees if IP is within that function, and pops the return 1679 address off the stack so that ip is placed within the library 1680 function calling the syscall. This makes stack backtraces much 1681 more useful. 1682 1683 The function is assumed to look like this (from glibc-2.3.6 sources): 1684 _dl_sysinfo_int80: 1685 int $0x80 1686 ret 1687 That is 3 (2+1) bytes long. We could be more thorough and check 1688 the 3 bytes of the function are as expected, but I can't be 1689 bothered. 1690 */ 1691 if (VG_(client__dl_sysinfo_int80) != 0 /* we know its address */ 1692 && startRegs.r_pc >= VG_(client__dl_sysinfo_int80) 1693 && startRegs.r_pc < VG_(client__dl_sysinfo_int80)+3 1694 && VG_(am_is_valid_for_client)(startRegs.r_pc, sizeof(Addr), 1695 VKI_PROT_READ)) { 1696 startRegs.r_pc = (ULong) *(Addr*)(UWord)startRegs.r_sp; 1697 startRegs.r_sp += (ULong) sizeof(Addr); 1698 } 1699 # endif 1700 1701 /* See if we can get a better idea of the stack limits */ 1702 VG_(stack_limits)( (Addr)startRegs.r_sp, 1703 &stack_lowest_byte, &stack_highest_byte ); 1704 1705 /* Take into account the first_ip_delta. */ 1706 startRegs.r_pc += (Long)(Word)first_ip_delta; 1707 1708 if (0) 1709 VG_(printf)("tid %u: stack_highest=0x%08lx ip=0x%010llx " 1710 "sp=0x%010llx\n", 1711 tid, stack_highest_byte, 1712 startRegs.r_pc, startRegs.r_sp); 1713 1714 return VG_(get_StackTrace_wrk)(tid, ips, max_n_ips, 1715 sps, fps, 1716 &startRegs, 1717 stack_highest_byte); 1718 } 1719 1720 static void printIpDesc(UInt n, Addr ip, void* uu_opaque) 1721 { 1722 InlIPCursor *iipc = VG_(new_IIPC)(ip); 1723 1724 do { 1725 const HChar *buf = VG_(describe_IP)(ip, iipc); 1726 if (VG_(clo_xml)) { 1727 VG_(printf_xml)(" %s\n", buf); 1728 } else { 1729 VG_(message)(Vg_UserMsg, " %s %s\n", 1730 ( n == 0 ? "at" : "by" ), buf); 1731 } 1732 n++; 1733 // Increase n to show "at" for only one level. 1734 } while (VG_(next_IIPC)(iipc)); 1735 VG_(delete_IIPC)(iipc); 1736 } 1737 1738 /* Print a StackTrace. */ 1739 void VG_(pp_StackTrace) ( StackTrace ips, UInt n_ips ) 1740 { 1741 vg_assert( n_ips > 0 ); 1742 1743 if (VG_(clo_xml)) 1744 VG_(printf_xml)(" <stack>\n"); 1745 1746 VG_(apply_StackTrace)( printIpDesc, NULL, ips, n_ips ); 1747 1748 if (VG_(clo_xml)) 1749 VG_(printf_xml)(" </stack>\n"); 1750 } 1751 1752 /* Get and immediately print a StackTrace. */ 1753 void VG_(get_and_pp_StackTrace) ( ThreadId tid, UInt max_n_ips ) 1754 { 1755 Addr ips[max_n_ips]; 1756 UInt n_ips 1757 = VG_(get_StackTrace)(tid, ips, max_n_ips, 1758 NULL/*array to dump SP values in*/, 1759 NULL/*array to dump FP values in*/, 1760 0/*first_ip_delta*/); 1761 VG_(pp_StackTrace)(ips, n_ips); 1762 } 1763 1764 void VG_(apply_StackTrace)( 1765 void(*action)(UInt n, Addr ip, void* opaque), 1766 void* opaque, 1767 StackTrace ips, UInt n_ips 1768 ) 1769 { 1770 Bool main_done = False; 1771 Int i = 0; 1772 1773 vg_assert(n_ips > 0); 1774 do { 1775 Addr ip = ips[i]; 1776 1777 // Stop after the first appearance of "main" or one of the other names 1778 // (the appearance of which is a pretty good sign that we've gone past 1779 // main without seeing it, for whatever reason) 1780 if ( ! VG_(clo_show_below_main) ) { 1781 Vg_FnNameKind kind = VG_(get_fnname_kind_from_IP)(ip); 1782 if (Vg_FnNameMain == kind || Vg_FnNameBelowMain == kind) { 1783 main_done = True; 1784 } 1785 } 1786 1787 // Act on the ip 1788 action(i, ip, opaque); 1789 1790 i++; 1791 } while (i < n_ips && !main_done); 1792 } 1793 1794 1795 /*--------------------------------------------------------------------*/ 1796 /*--- end ---*/ 1797 /*--------------------------------------------------------------------*/ 1798