我的应用程序使用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调用了很多我的代码,所以我不认为我可以阻止任何堆栈,包括库。当然,即使我可以使用偏移量制作抑制文件,如果我重新编译库,所有这些都可以改变。
答案 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;工作得很好。