Как я могу подавить предупреждения Thread Sanitizer в Xcode из внешней библиотеки?

Xcode 8 включает Thread Sanitizer, инструмент для определения условий гонки и других проблем, связанных с многопоточностью.

Я пытаюсь запустить это против моего проекта и обнаруживаю много проблем со сторонней двоичной библиотекой. Эти проблемы преобладают в моем собственном коде, и я не могу заменить двоичную библиотеку, пока поставщик не исправит ее.

Как я могу подавить эти предупреждения Thread Sanitizer в Xcode для сторонней библиотеки?

1 ответ

Thread Sanitizer может использовать файлы подавления, чтобы выборочно отключать отчеты о проблемах, которые он обнаруживает в библиотеках вне вашего кода. Чтобы использовать их с Xcode, сначала создайте файл с именем TSan.supp (или что-то подобное) и вставьте в него строки вроде следующего:

mutex:Purge
mutex:ProcessBulkInData
mutex:EventDestroy

У меня возникали проблемы с плохими мьютексами в нескольких внутренних функциях в конкретной библиотеке, поэтому я подавил предупреждения мьютексов (mutex: часть вышеупомянутого), предоставляя подстроку из имен функций, которые появились в трассировке стека Sanitizer.

Как только вы сделали файл подавления, отредактируйте вашу схему Run в Xcode и перейдите на вкладку Arguments. В разделе Переменные среды добавьте имя TSAN_OPTIONS и дать ему значение suppressions=[path_to_TSan.supp], Путь должен быть относительно двоичного файла вашего приложения в вашем местоположении производных данных.

Возможно, вам придется запустить Thread Sanitizer несколько раз и отредактировать файл подавления, чтобы добавить каждый элемент из библиотеки, которую вы хотите отключить.

Формат файла и другие параметры этого файла подавления можно найти на этой вики-странице. Для потомков это

поток: подавляет отчеты, связанные с потоками (утечки)

мьютекс: подавляет сообщения, связанные с мьютексами (уничтожение заблокированного мьютекса)

signal: подавляет отчеты, относящиеся к обработчикам сигналов (вызовы обработчиков malloc())

тупик: подавляет сообщения об инверсии блокировки

named_from_lib: подавляет все перехватчики в конкретной библиотеке

Спасибо анонимному инженеру Apple, который объяснил этот процесс в ответ на недавнее сообщение об ошибке.

Другие вопросы по тегам