2015-05-07 28 views
1

我的應用程序使用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調用了很多我的代碼,所以我不認爲我可以阻止包括庫在內的任何堆棧。當然,即使我可以使用偏移量製作壓縮文件,如果我重新編譯庫,所有這些都可能會改變。

+0

這僅僅是TSAN問題還是符號問題?例如。使用gdb或lldb時你看到正確的符號嗎? –

+0

@VZ - 似乎是一個TSAN問題。插入一個「扔」;並運行在GDB 7.9中,可以在wxWidgets庫中顯示符號。 objdump - 調試<.so file>提供700萬行。它會說:「objdump:警告:.debug_loc部分中的位置列表從0x3a開始」。文件<.so file>說ELF 64位LSB共享對象,x86-64,版本1(FreeBSD),動態鏈接,沒有剝離。 – user1902689

+0

@VZ - 庫確實使用「-Wl, - version-script,/ ...../version-script」和「-Wl,-soname,libwx_baseu-3.0.so.0」。圖書館不使用「-Wl, - no-undefined」或「-Wl,-z,defs」,但我看到了那些導致衛生洗滌劑錯誤的原因,所以我會看看我是否可以輕易地擺脫這些「-Wl」呼叫。也許他們造成了這個問題。 – user1902689

回答

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測試版),並且應該位於FreeBSD 10.2及更高版本中。

順便說一句,「-Wl, - version-script ...」和「-Wl,-soname」正常工作。