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

C++ ThreadSanitizer(tsan)-来自共享库的有意义信息,c++,multithreading,clang,wxwidgets,thread-sanitizer,C++,Multithreading,Clang,Wxwidgets,Thread Sanitizer,我的应用程序使用了wxWidgets库,通过gcc 5.1.0从源代码构建,使用-g和-O0 我使用clang++36-g-fsanize=thread-stdlib=libc++编译了我的应用程序,并使用clang++36-g-fsanize=thread-stdlib=libc++-lc++abi链接它。它动态链接到wxWidgets 我收到的警告之一是: ================== WARNING: ThreadSanitizer: lock-order-inversion (p

我的应用程序使用了wxWidgets库,通过gcc 5.1.0从源代码构建,使用-g和-O0

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

我收到的警告之一是:

==================
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 ??
==================
==================
警告:ThreadSanitizer:锁顺序反转(潜在死锁)(pid=52741)
锁定顺序图中的循环:M115(0x7d080000ea60)=>M976(0x7D080000100)=>M115
在主线程中保持互斥M115时在此获取互斥M976:
#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(libwx_baseu-3.0.so.0+0x0000002376fa)
#2_启动(wxDebugSleep+0x00000041be4e)
提示:使用TSAN\u OPTIONS=second\u deadlock\u stack=1可获得更多信息性的警告消息
在主线程中保持互斥体M976时在此处获取互斥体M115:
#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(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(libwx_baseu-3.0.so.0+0x00000018b297)
#4_启动(wxDebugSleep+0x00000041be4e)
摘要:ThreadSanitizer:锁顺序反转(潜在死锁)?:0??
==================
我不高兴,因为:(1)我想尝试一下在wxWidgets库中查找线程错误;和(2)我希望能够使一个抑制文件在或接近一个警告与抑制文件的比率下运行

因此,我通过Clang3.6.0从源代码重新编译/链接了wxWidgets库,添加了-fsanize=thread-stdlib=libc++-lc++abi。我祈祷着,结果一切都很好

在我的wxWidgets gcc构建目录中运行sudo make uninstall,并在我的wxWidgets clang构建目录中运行sudo install

上面的警告现在显示:

==================
WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock) (pid=68453)
  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+0x0000003c24f9)
    #2 <null> <null> (libwx_baseu-3.0.so.0+0x0000003d0387)
    #3 <null> <null> (libwx_baseu-3.0.so.0+0x0000003d0000)
    #4 <null> <null> (libwx_baseu-3.0.so.0+0x0000001bd91c)
    #5 <null> <null> (libwx_baseu-3.0.so.0+0x000000279cd6)
    #6 <null> <null> (libwx_baseu-3.0.so.0+0x00000027a6da)
    #7 <null> <null> (libwx_baseu-3.0.so.0+0x00000024445d)
    #8 <null> <null> (libwx_baseu-3.0.so.0+0x000000244243)
    #9 <null> <null> (libwx_baseu-3.0.so.0+0x000000245a67)
    #10 <null> <null> (libwx_baseu-3.0.so.0+0x000000246856)
    #11 <null> <null> (libwx_baseu-3.0.so.0+0x000000245430)
    #12 <null> <null> (libwx_baseu-3.0.so.0+0x000000245934)
    #13 main /home/xxx/code/testing/wxDebugSleep/wxDebugSleep.cpp:11:1 (wxDebugSleep+0x000000472e9c)

    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+0x0000003c24f9)
    #2 <null> <null> (libwx_baseu-3.0.so.0+0x0000003d0387)
    #3 wxCriticalSection::Enter(void) /usr/local/include/wx-3.0/wx/thread.h:291:52 (wxDebugSleep+0x00000047c570)
    #4 wxCriticalSectionLocker::wxCriticalSectionLocker(wxCriticalSection&) /usr/local/include/wx-3.0/wx/thread.h:307:9 (wxDebugSleep+0x000000473216)
    #5 <null> <null> (libwx_baseu-3.0.so.0+0x000000245cf0)
    #6 <null> <null> (libwx_baseu-3.0.so.0+0x000000246949)
    #7 <null> <null> (libwx_baseu-3.0.so.0+0x00000024574b)
    #8 <null> <null> (libwx_baseu-3.0.so.0+0x000000245934)
    #9 main /home/xxx/code/testing/wxDebugSleep/wxDebugSleep.cpp:11:1 (wxDebugSleep+0x000000472e9c)

SUMMARY: ThreadSanitizer: lock-order-inversion (potential deadlock) ??:0 ??
==================
==================
警告:ThreadSanitizer:锁顺序反转(潜在死锁)(pid=68453)
锁定顺序图中的循环:M115(0x7d080000ea60)=>M976(0x7D080000100)=>M115
在主线程中保持互斥M115时在此获取互斥M976:
#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(libwx_baseu-3.0.so.0+0x0000003c24f9)
#2(libwx_baseu-3.0.so.0+0x0000003d0387)
#3(libwx_baseu-3.0.so.0+0x0000003d0000)
#4(libwx_baseu-3.0.so.0+0x0000001bd91c)
#5(libwx_baseu-3.0.so.0+0x000000279cd6)
#6(libwx_baseu-3.0.so.0+0x00000027a6da)
#7(libwx_baseu-3.0.so.0+0x00000024445d)
#8(libwx_baseu-3.0.so.0+0x000000244243)
#9(libwx_baseu-3.0.so.0+0x000000245a67)
#10(libwx_baseu-3.0.so.0+0x000000246856)
#11(libwx_baseu-3.0.so.0+0x000000245430)
#12(libwx_baseu-3.0.so.0+0x000000245934)
#13 main/home/xxx/code/testing/wxDebugSleep/wxDebugSleep.cpp:11:1(wxDebugSleep+0x000000472e9c)
提示:使用TSAN\u OPTIONS=second\u deadlock\u stack=1可获得更多信息性的警告消息
在主线程中保持互斥体M976时在此处获取互斥体M115:
#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(libwx_baseu-3.0.so.0+0x0000003c24f9)
#2(libwx_baseu-3.0.so.0+0x0000003d0387)
#3 wxCriticalSection::输入(void)/usr/local/include/wx-3.0/wx/thread.h:291:52(wxDebugSleep+0x00000047c570)
#4 wxCriticalSectionLocker::wxCriticalSectionLocker(wxCriticalSection&)/usr/local/include/wx-3.0/wx/thread.h:307:9(wxDebugSleep+0x000000473216)
#5(libwx_baseu-3.0.so.0+0x000000245cf0)
#6(libwx_baseu-3.0.so.0+0x000000246949)
#7(libwx_baseu-3.0.so.0+0x00000024574b)
#8(libwx_baseu-3.0.so.0+0x000000245934)
#9 main/home/xxx/code/testing/wxDebugSleep/wxDebugSleep.cpp:11:1(wxDebugSleep+0x000000472e9c)
摘要:ThreadSanitizer:锁顺序反转(潜在死锁)?:0??
==================
我在运行程序的环境中定义了TSAN_OPTIONS=second_deadlock_stack=1,它没有改变输出

嗯,这是一些进步。我肯定我会使用错误的术语,但它好像缺少了库的符号文件

我已经使用clang&-fsanize=thread(ldd和时间戳)检查了它是否与新库动态链接

我已经检查了库是否使用-g和-O0编译(尽管它可能更高)

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

问题1-如何从共享库获取“堆栈跟踪”以显示文件名和行号


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

问题是FreeBSD 10.1及之前版本存在一个bug,阻止llvm Symboler正常工作。llvm Symboler是TSAN获取符号信息的方式。更具体地说,FreeBSD在dl_iterate_phdr中提供了一个没有路径的dlpi_名称。这是一个补丁。该补丁在FreeBSD 10-STABLE中提供(在回答此问题时,它类似于10.2 beta版),并且应该在FreeBSD 10.2及更高版本中提供


顺便说一句,“-Wl,-version script…”和“-Wl,-soname”效果很好。

这只是TSAN问题还是符号问题?你看到正确的符号了吗