aboutsummaryrefslogtreecommitdiff
path: root/docs/ThreadSanitizer.rst
blob: 5f04170da67bfe4dd2ab3828c98e88a52a449098 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
ThreadSanitizer
===============

Introduction
------------

ThreadSanitizer is a tool that detects data races.  It consists of a compiler
instrumentation module and a run-time library.  Typical slowdown introduced by
ThreadSanitizer is **5x-15x** (TODO: these numbers are approximate so far).

How to build
------------

Follow the `Clang build instructions <../get_started.html>`_.  CMake build is
supported.

Supported Platforms
-------------------

ThreadSanitizer is supported on Linux x86_64 (tested on Ubuntu 10.04).  Support
for MacOS 10.7 (64-bit only) is planned for late 2012.  Support for 32-bit
platforms is problematic and not yet planned.

Usage
-----

Simply compile your program with ``-fsanitize=thread -fPIE`` and link it with
``-fsanitize=thread -pie``.  To get a reasonable performance add ``-O1`` or
higher.  Use ``-g`` to get file names and line numbers in the warning messages.

Example:

.. code-block:: c++

  % cat projects/compiler-rt/lib/tsan/output_tests/tiny_race.c
  #include <pthread.h>
  int Global;
  void *Thread1(void *x) {
    Global = 42;
    return x;
  }
  int main() {
    pthread_t t;
    pthread_create(&t, NULL, Thread1, NULL);
    Global = 43;
    pthread_join(t, NULL);
    return Global;
  }

  $ clang -fsanitize=thread -g -O1 tiny_race.c -fPIE -pie

If a bug is detected, the program will print an error message to stderr.
Currently, ThreadSanitizer symbolizes its output using an external
``addr2line`` process (this will be fixed in future).

.. code-block:: bash

  % TSAN_OPTIONS=strip_path_prefix=`pwd`/  # Don't print full paths.
  % ./a.out 2> log
  % cat log
  WARNING: ThreadSanitizer: data race (pid=19219)
    Write of size 4 at 0x7fcf47b21bc0 by thread 1:
      #0 Thread1 tiny_race.c:4 (exe+0x00000000a360)
    Previous write of size 4 at 0x7fcf47b21bc0 by main thread:
      #0 main tiny_race.c:10 (exe+0x00000000a3b4)
    Thread 1 (running) created at:
      #0 pthread_create ??:0 (exe+0x00000000c790)
      #1 main tiny_race.c:9 (exe+0x00000000a3a4)

Limitations
-----------

* ThreadSanitizer uses more real memory than a native run. At the default
  settings the memory overhead is 9x plus 9Mb per each thread. Settings with 5x
  and 3x overhead (but less accurate analysis) are also available.
* ThreadSanitizer maps (but does not reserve) a lot of virtual address space.
  This means that tools like ``ulimit`` may not work as usually expected.
* Static linking is not supported.
* ThreadSanitizer requires ``-fPIE -pie``.

Current Status
--------------

ThreadSanitizer is in alpha stage.  It is known to work on large C++ programs
using pthreads, but we do not promise anything (yet).  C++11 threading is not
yet supported.  The test suite is integrated into CMake build and can be run
with ``make check-tsan`` command.

We are actively working on enhancing the tool --- stay tuned.  Any help,
especially in the form of minimized standalone tests is more than welcome.

More Information
----------------
`http://code.google.com/p/thread-sanitizer <http://code.google.com/p/thread-sanitizer/>`_.