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 エンジニアに感謝します。