[PATCH] D27866: [tsan] Pass BP and stack bounds to Unwind() to get full stack traces on failed CHECKs

Kuba (Brecka) Mracek via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 16 15:30:53 PST 2016


kubabrecka created this revision.
kubabrecka added a reviewer: dvyukov.
kubabrecka added subscribers: llvm-commits, zaks.anna.
kubabrecka set the repository for this revision to rL LLVM.
kubabrecka added a project: Sanitizers.

At least on Darwin, the fast unwinder called from TsanCheckFailed completely fails to unwind anything, because we don't give it a valid bp, stack_top and stack_bottom.  Let's fix that.


Repository:
  rL LLVM

https://reviews.llvm.org/D27866

Files:
  lib/tsan/rtl/tsan_rtl_report.cc


Index: lib/tsan/rtl/tsan_rtl_report.cc
===================================================================
--- lib/tsan/rtl/tsan_rtl_report.cc
+++ lib/tsan/rtl/tsan_rtl_report.cc
@@ -697,7 +697,10 @@
   BufferedStackTrace *ptrace =
       new(internal_alloc(MBlockStackTrace, sizeof(BufferedStackTrace)))
           BufferedStackTrace();
-  ptrace->Unwind(kStackTraceMax, pc, 0, 0, 0, 0, false);
+  uptr stack_bottom = cur_thread()->stk_addr;
+  uptr stack_top = stack_bottom + cur_thread()->stk_size;
+  uptr bp = GET_CURRENT_FRAME();
+  ptrace->Unwind(kStackTraceMax, pc, bp, 0, stack_top, stack_bottom, false);
   for (uptr i = 0; i < ptrace->size / 2; i++) {
     uptr tmp = ptrace->trace_buffer[i];
     ptrace->trace_buffer[i] = ptrace->trace_buffer[ptrace->size - i - 1];


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27866.81805.patch
Type: text/x-patch
Size: 779 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161216/e3d9f258/attachment.bin>


More information about the llvm-commits mailing list