Как я могу подавить предупреждения 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, который объяснил этот процесс в ответ на недавнее сообщение об ошибке.