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

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

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

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

Ответ 1

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

mutex:Purge
mutex:ProcessBulkInData
mutex:EventDestroy

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

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

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

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

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

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

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

тупик: подавляет отчеты об отключении блокировки

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

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