[ThreadSanitizer] Get deadlocks working

+thread-sanitizer mailing list

Hi,

I am interested in understand the compiler-rt thread sanitizer tool and have
recently started experimenting with it. In particular, I'm interested in the
deadlock detector.

I see that deadlock detection currently don't work. (I tried with a few
simple deadlocks, as well as the test case "must_deadlock.cc" that is in the
test-suite). I understand from the comments that this is because the real
pthread_mutex_lock() is called before the handler (MutexLock()) in tsan.

1. Is there any particular reason that this interceptor is designed this
way? Can there be a callback prior to calling the real pthread_mutex_lock()
that can, for example, detect deadlocks?
2. Upon debugging a simple test case, I see that there is a worker thread
that is created. Can this worker not check for the deadlock when the actual
threads are deadlocked.

Hello Vaivaswatha,

Yes, tsan currently detects only _potential_ deadlocks. On actual
deadlocks it deadlocks as well.
This is just not implemented yet. Yes, mutex callback needs to be
split into pre and post parts. The deadlock detector already has
separate callbacks for these events, it is just a matter of threading
these callbacks through tsan code.
You can look at the standalone deadlock detector in
lib/tsan/dd/dd_interceptors.cc, it does it correctly.

+thread-sanitizer mailing list

> Hi,
>
> I am interested in understand the compiler-rt thread sanitizer tool and
have
> recently started experimenting with it. In particular, I'm interested in
the
> deadlock detector.
>
> I see that deadlock detection currently don't work. (I tried with a few
> simple deadlocks, as well as the test case "must_deadlock.cc" that is in
the
> test-suite). I understand from the comments that this is because the real
> pthread_mutex_lock() is called before the handler (MutexLock()) in tsan.
>
> 1. Is there any particular reason that this interceptor is designed this
> way? Can there be a callback prior to calling the real
pthread_mutex_lock()
> that can, for example, detect deadlocks?
> 2. Upon debugging a simple test case, I see that there is a worker thread
> that is created. Can this worker not check for the deadlock when the
actual
> threads are deadlocked.

Hello Vaivaswatha,

Yes, tsan currently detects only _potential_ deadlocks. On actual
deadlocks it deadlocks as well.
This is just not implemented yet.

Correct, I just did not have time to implement this.
In practice this is not the most important thing to have because
if the deadlock has actually happened in a test it is easy to find.
The potential deadlocks are more important.
Yet I fully agree this needs to be implemented.

--kcc

Thanks Kostya and Dmiitry, that was helpful.