我的應用程序使用wxWidgets庫,經由GCC 5.1.0從源爲基礎,使用-g和-O0ThreadSanitizer(TSAN) - 從共享庫
有意義的信息我使用鐺++ 36 -g編譯我的應用程序-sanitize = thread -stdlib = libC++,並使用clang ++ 36鏈接它。-g -fsanitize = 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 ??
==================
我卻高興不起來,因爲:(1)我想有在發現的wxWidgets庫的線程錯誤,一拍;和(2)我希望能夠製作一個壓縮文件,在壓縮文件比率或接近一個警告的情況下運行。
因此,我通過clang 3.6.0重新編譯/鏈接了wxWidgets庫,添加-fsanitize = thread -stdlib = libC++ -lC++ abi。橫過我的手指,它完成得很好。
Ran sudo在我的wxWidgets gcc build目錄下卸載,sudo安裝在我的wxWidgets clang build目錄下。
警告上述現在顯示:
==================
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 ??
==================
我在正在運行的程序的環境中定義TSAN_OPTIONS = second_deadlock_stack = 1,它並沒有改變的輸出。
嗯,這是一些進步。我相信我會用錯誤的術語,但它就像缺少了庫的符號文件。
我檢查了,它的動態對新圖書館使用鐺& -fsanitize =螺紋連接(LDD和時間戳。)
我檢查了該庫使用-g和-O0(編譯即使它可能更高。)
萬一它很重要,FreeBSD 10.1 64位。 Clang從源碼編譯。
問題1 - 如何從共享庫中獲取「堆棧跟蹤」以顯示文件名和行號?
問題2 - 如果我不能,我該如何製作一個很好的壓縮文件?問題是wxWidgets調用了很多我的代碼,所以我不認爲我可以阻止包括庫在內的任何堆棧。當然,即使我可以使用偏移量製作壓縮文件,如果我重新編譯庫,所有這些都可能會改變。
這僅僅是TSAN問題還是符號問題?例如。使用gdb或lldb時你看到正確的符號嗎? –
@VZ - 似乎是一個TSAN問題。插入一個「扔」;並運行在GDB 7.9中,可以在wxWidgets庫中顯示符號。 objdump - 調試<.so file>提供700萬行。它會說:「objdump:警告:.debug_loc部分中的位置列表從0x3a開始」。文件<.so file>說ELF 64位LSB共享對象,x86-64,版本1(FreeBSD),動態鏈接,沒有剝離。 – user1902689
@VZ - 庫確實使用「-Wl, - version-script,/ ...../version-script」和「-Wl,-soname,libwx_baseu-3.0.so.0」。圖書館不使用「-Wl, - no-undefined」或「-Wl,-z,defs」,但我看到了那些導致衛生洗滌劑錯誤的原因,所以我會看看我是否可以輕易地擺脫這些「-Wl」呼叫。也許他們造成了這個問題。 – user1902689