ThreadSanitizer(tsan) - 来自共享库的有意义的信息

时间:2015-05-07 05:20:38

标签: c++ multithreading clang wxwidgets thread-sanitizer

我的应用程序使用wxWidgets库,使用-g和-O0

从源代码通过gcc 5.1.0构建

我使用clang ++ 36 -g -fsanitize = thread -stdlib = libc ++编译我的应用程序,并使用clang ++ 36 -g -fsanitize = thread -stdlib = libc ++ -lc ++ abi链接它。它动态链接到wxWidgets。

我收到的警告之一是:

Name    *Ident        // type name
                      ^^^^^^^^^^^
                      // the comment associated to Name
                      // could go on over several lines

我并不高兴,因为:(1)我想在wxWidgets库中找到线程错误; (2)我希望能够在抑制文件比率的一个警告或附近操作抑制文件。

所以,我通过clang 3.6.0从源代码重新编译/链接了wxWidgets库,添加了-fsanitize = thread -stdlib = libc ++ -lc ++ abi。我的手指交叉,完成得很好。

在我的wxWidgets gcc构建目录中运行rado sudo,在我的wxWidgets clang构建目录中安装sudo。

上面的警告现在显示:

==================
WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock) (pid=52741)
  Cycle in lock order graph: M115 (0x7d080000ea60) => M976 (0x7d0800000100) => M115

  Mutex M976 acquired here while holding mutex M115 in main thread:
    #0 pthread_mutex_lock /home/xxx/sourceInstallations/llvm-3.6.0/projects/compiler-rt/lib/tsan/../sanitizer_common/sanitizer_common_interceptors.inc:3008 (wxDebugSleep+0x00000043b0ef)
    #1 <null> <null> (libwx_baseu-3.0.so.0+0x0000002376fa)
    #2 _start <null> (wxDebugSleep+0x00000041be4e)

    Hint: use TSAN_OPTIONS=second_deadlock_stack=1 to get more informative warning message

  Mutex M115 acquired here while holding mutex M976 in main thread:
    #0 pthread_mutex_lock /home/xxx/sourceInstallations/llvm-3.6.0/projects/compiler-rt/lib/tsan/../sanitizer_common/sanitizer_common_interceptors.inc:3008 (wxDebugSleep+0x00000043b0ef)
    #1 <null> <null> (libwx_baseu-3.0.so.0+0x0000002376fa)
    #2 wxCriticalSectionLocker::wxCriticalSectionLocker(wxCriticalSection&) /usr/local/include/wx-3.0/wx/thread.h:307:9 (wxDebugSleep+0x000000473216)
    #3 <null> <null> (libwx_baseu-3.0.so.0+0x00000018b297)
    #4 _start <null> (wxDebugSleep+0x00000041be4e)

SUMMARY: ThreadSanitizer: lock-order-inversion (potential deadlock) ??:0 ??
==================

我在正在运行的程序的环境中定义了TSAN_OPTIONS = second_deadlock_stack = 1,并且它没有改变输出。

嗯,它取得了一些进展。我确定我会使用错误的术语,但它就像缺少了图书馆的符号文件一样。

我已经检查过它是否使用clang&amp; amp;动态链接到新库-fsanitize = thread(ldd和timestamps。)

我已经检查过该库正在使用-g和-O0进行编译(即使它可能更高。)

如果重要,FreeBSD 10.1 64位。 Clang是从源代码编译而来的。

问题1 - 如何获得&#34;堆栈跟踪&#34;从共享库中显示文件名和行号?

问题2 - 如果我不能,我怎样才能制作好的抑制文件?问题是wxWidgets调用了很多我的代码,所以我不认为我可以阻止任何堆栈,包括库。当然,即使我可以使用偏移量制作抑制文件,如果我重新编译库,所有这些都可以改变。

1 个答案:

答案 0 :(得分:2)

问题是FreeBSD 10.1及之前有一个bug,阻止llvm-symbolizer正常工作。 llvm-symbolizer是TSAN获取符号信息的方式。更具体地说,FreeBSD在dl_iterate_phdr中给出了没有路径的dlpi_name。这是在https://reviews.freebsd.org/D932修补的。这个补丁在FreeBSD 10-STABLE中可用(在这个答案的时候是10.2 beta),应该在FreeBSD 10.2及更高版本中。

BTW,&#34; -Wl, - 版本脚本......&#34;和&#34; -Wl,-soname&#34;工作得很好。