Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 1 | ThreadSanitizer |
| 2 | =============== |
| 3 | |
| 4 | Introduction |
| 5 | ------------ |
| 6 | |
| 7 | ThreadSanitizer is a tool that detects data races. It consists of a compiler |
| 8 | instrumentation module and a run-time library. Typical slowdown introduced by |
Dmitry Vyukov | c092cba | 2012-12-17 07:16:54 +0000 | [diff] [blame] | 9 | ThreadSanitizer is about **5x-15x**. Typical memory overhead introduced by |
| 10 | ThreadSanitizer is about **5x-10x**. |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 11 | |
| 12 | How to build |
| 13 | ------------ |
| 14 | |
| 15 | Follow the `Clang build instructions <../get_started.html>`_. CMake build is |
| 16 | supported. |
| 17 | |
| 18 | Supported Platforms |
| 19 | ------------------- |
| 20 | |
Dmitry Vyukov | c092cba | 2012-12-17 07:16:54 +0000 | [diff] [blame] | 21 | ThreadSanitizer is supported on Linux x86_64 (tested on Ubuntu 10.04 and 12.04). |
| 22 | Support for MacOS 10.7 (64-bit only) is planned for 2013. Support for 32-bit |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 23 | platforms is problematic and not yet planned. |
| 24 | |
| 25 | Usage |
| 26 | ----- |
| 27 | |
| 28 | Simply compile your program with ``-fsanitize=thread -fPIE`` and link it with |
| 29 | ``-fsanitize=thread -pie``. To get a reasonable performance add ``-O1`` or |
| 30 | higher. Use ``-g`` to get file names and line numbers in the warning messages. |
| 31 | |
| 32 | Example: |
| 33 | |
| 34 | .. code-block:: c++ |
| 35 | |
Dmitry Vyukov | c092cba | 2012-12-17 07:16:54 +0000 | [diff] [blame] | 36 | % cat projects/compiler-rt/lib/tsan/lit_tests/tiny_race.c |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 37 | #include <pthread.h> |
| 38 | int Global; |
| 39 | void *Thread1(void *x) { |
| 40 | Global = 42; |
| 41 | return x; |
| 42 | } |
| 43 | int main() { |
| 44 | pthread_t t; |
| 45 | pthread_create(&t, NULL, Thread1, NULL); |
| 46 | Global = 43; |
| 47 | pthread_join(t, NULL); |
| 48 | return Global; |
| 49 | } |
| 50 | |
| 51 | $ clang -fsanitize=thread -g -O1 tiny_race.c -fPIE -pie |
| 52 | |
| 53 | If a bug is detected, the program will print an error message to stderr. |
| 54 | Currently, ThreadSanitizer symbolizes its output using an external |
| 55 | ``addr2line`` process (this will be fixed in future). |
| 56 | |
| 57 | .. code-block:: bash |
| 58 | |
Dmitry Vyukov | c092cba | 2012-12-17 07:16:54 +0000 | [diff] [blame] | 59 | % ./a.out |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 60 | WARNING: ThreadSanitizer: data race (pid=19219) |
Dmitry Vyukov | c092cba | 2012-12-17 07:16:54 +0000 | [diff] [blame] | 61 | Write of size 4 at 0x7fcf47b21bc0 by thread T1: |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 62 | #0 Thread1 tiny_race.c:4 (exe+0x00000000a360) |
Dmitry Vyukov | c092cba | 2012-12-17 07:16:54 +0000 | [diff] [blame] | 63 | |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 64 | Previous write of size 4 at 0x7fcf47b21bc0 by main thread: |
| 65 | #0 main tiny_race.c:10 (exe+0x00000000a3b4) |
Dmitry Vyukov | c092cba | 2012-12-17 07:16:54 +0000 | [diff] [blame] | 66 | |
| 67 | Thread T1 (running) created at: |
| 68 | #0 pthread_create tsan_interceptors.cc:705 (exe+0x00000000c790) |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 69 | #1 main tiny_race.c:9 (exe+0x00000000a3a4) |
| 70 | |
Dmitry Vyukov | 728e212 | 2012-12-17 08:52:05 +0000 | [diff] [blame] | 71 | ``__has_feature(thread_sanitizer)`` |
| 72 | ------------------------------------ |
| 73 | |
| 74 | In some cases one may need to execute different code depending on whether |
| 75 | ThreadSanitizer is enabled. |
| 76 | :ref:`\_\_has\_feature <langext-__has_feature-__has_extension>` can be used for |
| 77 | this purpose. |
| 78 | |
| 79 | .. code-block:: c |
| 80 | |
| 81 | #if defined(__has_feature) && __has_feature(thread_sanitizer) |
| 82 | // code that builds only under ThreadSanitizer |
| 83 | #endif |
| 84 | |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 85 | Limitations |
| 86 | ----------- |
| 87 | |
| 88 | * ThreadSanitizer uses more real memory than a native run. At the default |
Dmitry Vyukov | c092cba | 2012-12-17 07:16:54 +0000 | [diff] [blame] | 89 | settings the memory overhead is 5x plus 1Mb per each thread. Settings with 3x |
| 90 | (less accurate analysis) and 9x (more accurate analysis) overhead are also |
| 91 | available. |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 92 | * ThreadSanitizer maps (but does not reserve) a lot of virtual address space. |
| 93 | This means that tools like ``ulimit`` may not work as usually expected. |
Dmitry Vyukov | c092cba | 2012-12-17 07:16:54 +0000 | [diff] [blame] | 94 | * Libc/libstdc++ static linking is not supported. |
| 95 | * ThreadSanitizer requires ``-fPIE -pie`` compiler flags. |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 96 | |
| 97 | Current Status |
| 98 | -------------- |
| 99 | |
Dmitry Vyukov | c092cba | 2012-12-17 07:16:54 +0000 | [diff] [blame] | 100 | ThreadSanitizer is in beta stage. It is known to work on large C++ programs |
| 101 | using pthreads, but we do not promise anything (yet). C++11 threading is |
Dmitry Vyukov | 61dde19 | 2012-12-17 13:07:35 +0000 | [diff] [blame] | 102 | supported with llvm libc++. The test suite is integrated into CMake build |
Dmitry Vyukov | c092cba | 2012-12-17 07:16:54 +0000 | [diff] [blame] | 103 | and can be run with ``make check-tsan`` command. |
Sean Silva | 3872b46 | 2012-12-12 23:44:55 +0000 | [diff] [blame] | 104 | |
| 105 | We are actively working on enhancing the tool --- stay tuned. Any help, |
| 106 | especially in the form of minimized standalone tests is more than welcome. |
| 107 | |
| 108 | More Information |
| 109 | ---------------- |
| 110 | `http://code.google.com/p/thread-sanitizer <http://code.google.com/p/thread-sanitizer/>`_. |
| 111 | |