2016-07-07 58 views
10

Xcode 8集成了Thread Sanitizer,一種用於檢測競態條件和其他線程相關問題的工具。如何從外部庫中抑制Xcode中的Thread Sanitizer警告?

我試圖運行這個對我的一個項目,並檢測到與第三方二進制庫的許多問題。這些問題壓倒了我自己代碼中的任何問題,並且在供應商修復它之前,我無法替換二進制庫。

如何在Xcode中爲第三方庫抑制這些Thread Sanitizer警告?

+0

這裏我們有兩種情況; 1)線程消毒器產生一堆無用的警告,在這種情況下應該扔掉工具;或2)警告是真實的,在這種情況下,還有兩種情況2a)您可以放置​​適當的互斥體,因此應該這樣做,或者2b)*在這種情況下,如果供應商不會修復它,則必須拋出庫*。庫中的競爭條件無法防範意味着庫不適合多線程代碼。 – Joshua

+0

不要忽略競態條件或潛在的堆腐敗問題,因爲您無法替換庫。這就是完全的瘋狂。 – Joshua

回答

16

線程淨化器可以使用抑制文件來選擇性地關閉報告,檢測它在代碼之外的庫中檢測到的問題。要使用這些用Xcode中,首先創建一個名爲TSan.supp(或類似的東西)文件,並把線到它類似如下:

mutex:Purge 
mutex:ProcessBulkInData 
mutex:EventDestroy 

我在某個特定庫中遇到的幾個內部功能不好的互斥問題,所以我通過在Thread Sanitizer堆棧跟蹤中出現的函數名稱提供一個子字符串來抑制互斥警告(上述mutex:部分)。

一旦你完成了壓縮文件,在Xcode中編輯你的Run方案並轉到Arguments選項卡。在環境變量下,添加名稱TSAN_OPTIONS並賦予其值suppressions=[path_to_TSan.supp]。路徑將需要相對於您的派生數據位置中的應用程序的二進制文件。

您可能需要多次運行Thread Sanitizer並編輯您的壓縮文件以添加要壓縮的庫中的每個項目。

此抑制文件的文件格式和其他選項可在this wiki page上找到。爲後代,這些是

螺紋:抑制(泄漏)

互斥有關線程報告:抑制有關互斥(鎖定互斥的破壞)

信號報告:抑制與信號處理程序有關的報告(處理程序調用malloc())

死鎖:抑制鎖定反轉報道

called_from_lib:抑制所有攔截器在一個特定的庫

由於去匿名蘋果工程師誰在迴應最近的bug報告解釋了這個過程。