15

Xcode 8 には、競合状態やその他のスレッド関連の問題を検出するためのツールである Thread Sanitizer が組み込まれています。

これを私のプロジェクトに対して実行しようとしていますが、サードパーティのバイナリ ライブラリで多くの問題を検出しています。これらの問題は、私自身のコードのどの問題よりも圧倒的であり、ベンダーが修正するまでバイナリ ライブラリを置き換えることはできません。

サードパーティ ライブラリの Xcode でこれらの Thread Sanitizer 警告を抑制するにはどうすればよいですか?

4

1 に答える 1

21

Thread Sanitizer は抑制ファイルを使用して、コード外のライブラリで検出された問題のレポートを選択的に無効にすることができます。これらを Xcode で使用するには、まずTSan.supp(またはそれに類似した) という名前のファイルを作成し、次のような行をその中に入れます。

mutex:Purge
mutex:ProcessBulkInData
mutex:EventDestroy

特定のライブラリ内のいくつかの内部関数で不適切なミューテックスに関する問題が発生していたためmutex:、スレッド サニタイザー スタック トレースに表示される関数名の部分文字列を提供することで、ミューテックスの警告 (上記の一部) を抑制しました。

抑制ファイルを作成したら、Xcode で実行スキームを編集し、[引数] タブに移動します。[環境変数] の下に名前TSAN_OPTIONSを追加し、値をsuppressions=[path_to_TSan.supp]. パスは、派生データの場所にあるアプリケーションのバイナリ ファイルからの相対パスである必要があります。

Thread Sanitizer を数回実行し、抑制ファイルを編集して、抑制したいライブラリの各項目を追加する必要がある場合があります。

この抑制ファイルのファイル形式とその他のオプションについては、この wiki ページを参照してください。後世のために、これらは

thread : スレッドに関連するレポートを抑制します (リーク)

mutex : ミューテックスに関連するレポートを抑制します (ロックされたミューテックスの破棄)

signal : シグナル ハンドラーに関連するレポートを抑制します (ハンドラーは malloc() を呼び出します)。

deadlock : ロック反転レポートを抑制します

called_from_lib : 特定のライブラリ内のすべてのインターセプターを抑制します

最近のバグ レポートに対応してこのプロセスを説明してくれた匿名の Apple エンジニアに感謝します。

于 2016-07-07T17:07:00.503 に答える