#c #linux #gcc #x86 #valgrind
#c #linux #gcc #x86 #valgrind
Вопрос:
Какие инструменты вы использовали для определения условий гонки для многопоточных программ в Linux.
Я использую инструмент helgrind от valgrind, но я заметил, что иногда он пропускает условия гонки.
Комментарии:
1. Я предлагаю изменить вопрос на «Каковы способы определения условий гонки в Linux?». Некоторым людям, похоже, не нравится то, как это сформулировано в настоящее время.
Ответ №1:
Возможно, вы захотите попробовать ThreadSanitizer.
Он отличается от Helgrind тем, что в гибридном режиме «может давать больше ложных срабатываний, но намного быстрее, предсказуемее и обнаруживает больше реальных гонок».
Ответ №2:
Вы также можете использовать инструмент DRD Valgrind вместе с helgrind. Хотя я не пробовал DRD, он должен обнаружить некоторые ошибки, пропущенные helgrind, поэтому стоит использовать оба инструмента для обнаружения большего количества ошибок.
Ответ №3:
Редактировать я как-то пропустил, что вы упомянули helgrind. Однако в моем тексте есть указания на то, почему helgrind мог пропустить такие случаи.
Вы можете использовать helgrind из инструментария valgrind
Helgrind — это инструмент Valgrind для обнаружения ошибок синхронизации в программах на C, C и Fortran, которые используют примитивы потоковой обработки POSIX pthreads.
Основными абстракциями в POSIX pthreads являются: набор потоков, совместно использующих общее адресное пространство, создание потока, присоединение к потоку, выход из потока, мьютексы (блокировки), переменные состояния (уведомления о событиях между потоками), блокировки чтения-записи, спин-блокировки, семафоры и барьеры.
Helgrind может обнаруживать три класса ошибок, которые подробно обсуждаются в следующих трех разделах:
Подобные проблемы часто приводят к невоспроизводимым зависящим от времени сбоям, взаимоблокировкам и другому неправильному поведению, и их может быть трудно обнаружить другими способами.
Helgrind знает обо всех абстракциях pthread и отслеживает их эффекты настолько точно, насколько это возможно. На платформах x86 и amd64 он понимает и частично обрабатывает неявную блокировку, возникающую из-за использования префикса инструкции БЛОКИРОВКИ.
Helgrind работает лучше всего, когда ваше приложение использует только POSIX pthreads API. Однако, если вы хотите использовать пользовательские примитивы потоковой обработки, вы можете описать их поведение в Helgrind с помощью макросов ANNOTATE_*, определенных в helgrind.h. Эта функциональность была добавлена в выпуске 3.5.0 Valgrind и считается экспериментальной.