2016-07-07 8 views
10

Xcode 8には、競合状態やその他のスレッド関連の問題を検出するためのツールであるThread Sanitizerが組み込まれています。外部ライブラリからXcodeのスレッドサニタイズの警告をどのようにして抑制できますか?

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

サードパーティライブラリのXcodeでこれらのスレッドサニタイズの警告を表示しないようにするにはどうすればよいですか?

+0

ここでは2つのケースがあります。 1)Thread Sanitizerは無駄な警告のスタックを生成します。この場合、ツールは投げられるべきです。または2)警告が実際の場合、2つのケースがもう1つあります。2a)適切なミューテックスを置くことができます。そうする必要があります.2)*この場合、ベンダーがそれを修正しない場合はライブラリを投げる必要があります*。あなたが守れないライブラリの競合条件は、ライブラリがマルチスレッドコードにはまったく適合しないことを意味します。 – Joshua

+0

競合状態または潜在的なヒープ破損の問題は、ライブラリを置き換えることができないため無視しないでください。そういうわけで、まったくの狂気があります。 – Joshua

答えて

16

スレッドサニタイザは、サプレッションファイルを使用して、コード外のライブラリで検出された問題のレポートを選択的にオフにすることができます。 Xcodeの持つこれらを使用するには、まずTSan.supp(または類似した何かを)という名前のファイルを作成し、次のようにそれに行を置く:

mutex:Purge 
mutex:ProcessBulkInData 
mutex:EventDestroy 
私は特定のライブラリ内のいくつかの内部関数で悪いミューテックスの問題に遭遇した

ので、私は、Thread Sanitizerスタックトレースに現れた関数名から部分文字列を提供することによって、mutexの警告(上記のmutex:の一部)を抑制しました。

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

スレッド・サニタイザーを数回実行し、抑止ファイルを編集して、抑止するライブラリーの各項目を追加する必要があります。

この抑制ファイルのファイル形式とその他のオプションは、this wiki pageにあります。後世のために、これらは

スレッドです:スレッドに関連するレポート(リーク)

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

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

デッドロック:ロック反転が

called_from_libをレポート抑制:

おかげで、最近のバグ報告に応答して、このプロセスを説明した匿名のアップルのエンジニアに行く特定のライブラリ内のすべてのインターセプタを抑制することができます。

関連する問題