[compiler-rt] r204454 - [sanitizer] more human-readable deadlock reports

Alexey Samsonov samsonov at google.com
Fri Mar 21 05:41:10 PDT 2014


On Fri, Mar 21, 2014 at 3:37 PM, Kostya Serebryany <kcc at google.com> wrote:

> Author: kcc
> Date: Fri Mar 21 06:37:43 2014
> New Revision: 204454
>
> URL: http://llvm.org/viewvc/llvm-project?rev=204454&view=rev
> Log:
> [sanitizer] more human-readable deadlock reports
>
> Modified:
>     compiler-rt/trunk/lib/tsan/rtl/tsan_report.cc
>     compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc
>     compiler-rt/trunk/test/tsan/deadlock_detector_stress_test.cc
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_report.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_report.cc?rev=204454&r1=204453&r2=204454&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_report.cc (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_report.cc Fri Mar 21 06:37:43 2014
> @@ -162,6 +162,12 @@ static void PrintMutexShort(const Report
>    Printf("%sM%zd%s%s", d.Mutex(), rm->id, d.EndMutex(), after);
>  }
>
> +static void PrintMutexShortWitAddress(const ReportMutex *rm,
>

Typo in function name?


> +                                      const char *after) {
> +  Decorator d;
> +  Printf("%sM%zd (%p)%s%s", d.Mutex(), rm->id, rm->addr, d.EndMutex(),
> after);
> +}
> +
>  static void PrintMutex(const ReportMutex *rm) {
>    Decorator d;
>    if (rm->destroyed) {
> @@ -231,18 +237,30 @@ void PrintReport(const ReportDesc *rep)
>    Printf("%s", d.EndWarning());
>
>    if (rep->typ == ReportTypeDeadlock) {
> -    Printf("  Path: ");
> -    CHECK_GT(rep->mutexes.Size(), 0U);
> -    CHECK_EQ(rep->mutexes.Size() * 2, rep->stacks.Size());
> +    Printf("  Cycle in lock order graph: ");
>      for (uptr i = 0; i < rep->mutexes.Size(); i++)
> -      PrintMutexShort(rep->mutexes[i], " => ");
> +      PrintMutexShortWitAddress(rep->mutexes[i], " => ");
>      PrintMutexShort(rep->mutexes[0], "\n\n");
> +    CHECK_GT(rep->mutexes.Size(), 0U);
> +    CHECK_EQ(rep->mutexes.Size() * (flags()->second_deadlock_stack ? 2 :
> 1),
> +             rep->stacks.Size());
>      for (uptr i = 0; i < rep->mutexes.Size(); i++) {
> -      Printf("  Edge: ");
> -      PrintMutexShort(rep->mutexes[i], " => ");
> -      PrintMutexShort(rep->mutexes[(i+1) % rep->mutexes.Size()], "\n");
> -      PrintStack(rep->stacks[2*i]);
> -      PrintStack(rep->stacks[2*i+1]);
> +      Printf("  Mutex ");
> +      PrintMutexShort(rep->mutexes[(i + 1) % rep->mutexes.Size()],
> +                      " acquired here while holding mutex ");
> +      PrintMutexShort(rep->mutexes[i], ":\n");
> +      if (flags()->second_deadlock_stack) {
> +        PrintStack(rep->stacks[2*i]);
> +        Printf("  Mutex ");
> +        PrintMutexShort(rep->mutexes[i],
> +                        " previously acquired by the same thread
> here:\n");
> +        PrintStack(rep->stacks[2*i+1]);
> +      } else {
> +        PrintStack(rep->stacks[i]);
> +        if (i == 0)
> +          Printf("    Hint: use TSAN_OPTIONS=second_deadlock_stack=1 "
> +                 "to get more informative warning message\n\n");
> +      }
>      }
>    } else {
>      for (uptr i = 0; i < rep->stacks.Size(); i++) {
> @@ -261,8 +279,10 @@ void PrintReport(const ReportDesc *rep)
>    for (uptr i = 0; i < rep->locs.Size(); i++)
>      PrintLocation(rep->locs[i]);
>
> -  for (uptr i = 0; i < rep->mutexes.Size(); i++)
> -    PrintMutex(rep->mutexes[i]);
> +  if (rep->typ != ReportTypeDeadlock) {
> +    for (uptr i = 0; i < rep->mutexes.Size(); i++)
> +      PrintMutex(rep->mutexes[i]);
> +  }
>
>    for (uptr i = 0; i < rep->threads.Size(); i++)
>      PrintThread(rep->threads[i]);
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc?rev=204454&r1=204453&r2=204454&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc Fri Mar 21 06:37:43
> 2014
> @@ -417,7 +417,7 @@ void ReportDeadlock(ThreadState *thr, up
>    uptr dummy_pc = 0x42;
>    for (int i = 0; i < r->n; i++) {
>      uptr size;
> -    for (int j = 0; j < 2; j++) {
> +    for (int j = 0; j < (flags()->second_deadlock_stack ? 2 : 1); j++) {
>        u32 stk = r->loop[i].stk[j];
>        if (stk) {
>          const uptr *trace = StackDepotGet(stk, &size);
>
> Modified: compiler-rt/trunk/test/tsan/deadlock_detector_stress_test.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/deadlock_detector_stress_test.cc?rev=204454&r1=204453&r2=204454&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/test/tsan/deadlock_detector_stress_test.cc (original)
> +++ compiler-rt/trunk/test/tsan/deadlock_detector_stress_test.cc Fri Mar
> 21 06:37:43 2014
> @@ -152,17 +152,18 @@ class LockTest {
>      Lock_0_1();
>      Lock_1_0();
>      // CHECK: WARNING: ThreadSanitizer: lock-order-inversion (potential
> deadlock)
> -    // CHECK: Path: [[M1:M[0-9]+]] => [[M2:M[0-9]+]] => [[M1]]
> -    // CHECK: Edge: [[M1]] => [[M2]]
> +    // CHECK: Cycle in lock order graph: [[M1:M[0-9]+]] ([[A1]]) =>
> [[M2:M[0-9]+]] ([[A2]]) => [[M1]]
> +    // CHECK: Mutex [[M2]] acquired here while holding mutex [[M1]]
>      // CHECK:   #0 pthread_
> +    // CHECK-SECOND:   Mutex [[M1]] previously acquired by the same
> thread here:
>      // CHECK-SECOND:   #0 pthread_
> +    // CHECK-NOT-SECOND:   second_deadlock_stack=1 to get more
> informative warning message
>      // CHECK-NOT-SECOND-NOT:   #0 pthread_
> -    // CHECK: Edge: [[M2]] => [[M1]]
> +    // CHECK: Mutex [[M1]] acquired here while holding mutex [[M2]]
>      // CHECK:   #0 pthread_
> +    // CHECK-SECOND:   Mutex [[M2]] previously acquired by the same
> thread here:
>      // CHECK-SECOND:   #0 pthread_
>      // CHECK-NOT-SECOND-NOT:   #0 pthread_
> -    // CHECK: Mutex [[M1]] ([[A1]]) created at:
> -    // CHECK: Mutex [[M2]] ([[A2]]) created at:
>      // CHECK-NOT: WARNING: ThreadSanitizer:
>    }
>
> @@ -178,10 +179,7 @@ class LockTest {
>      Lock2(1, 2);
>      Lock2(2, 0);
>      // CHECK: WARNING: ThreadSanitizer: lock-order-inversion (potential
> deadlock)
> -    // CHECK: Path: [[M1:M[0-9]+]] => [[M2:M[0-9]+]] => [[M3:M[0-9]+]] =>
> [[M1]]
> -    // CHECK: Mutex [[M1]] ([[A1]]) created at:
> -    // CHECK: Mutex [[M2]] ([[A2]]) created at:
> -    // CHECK: Mutex [[M3]] ([[A3]]) created at:
> +    // CHECK: Cycle in lock order graph: [[M1:M[0-9]+]] ([[A1]]) =>
> [[M2:M[0-9]+]] ([[A2]]) => [[M3:M[0-9]+]] ([[A3]]) => [[M1]]
>      // CHECK-NOT: WARNING: ThreadSanitizer:
>    }
>
> @@ -426,12 +424,16 @@ class LockTest {
>      fprintf(stderr, "Starting Test16: detailed output test with two
> locks\n");
>      // CHECK: Starting Test16
>      // CHECK: WARNING: ThreadSanitizer: lock-order-inversion
> +    // CHECK: acquired here while holding mutex
>      // CHECK: LockTest::Acquire1
>      // CHECK-NEXT: LockTest::Acquire_0_then_1
> +    // CHECK-SECOND: previously acquired by the same thread here
>      // CHECK-SECOND: LockTest::Acquire0
>      // CHECK-SECOND-NEXT: LockTest::Acquire_0_then_1
> +    // CHECK: acquired here while holding mutex
>      // CHECK: LockTest::Acquire0
>      // CHECK-NEXT: LockTest::Acquire_1_then_0
> +    // CHECK-SECOND: previously acquired by the same thread here
>      // CHECK-SECOND: LockTest::Acquire1
>      // CHECK-SECOND-NEXT: LockTest::Acquire_1_then_0
>      Init(5);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140321/ff4caf58/attachment.html>


More information about the llvm-commits mailing list