Какие существуют способы определения условий гонки в Linux?

#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 может обнаруживать три класса ошибок, которые подробно обсуждаются в следующих трех разделах:

  1. Неправильное использование POSIX pthreads API.

  2. Потенциальные взаимоблокировки, возникающие из-за проблем с порядком блокировок.

  3. Гонки данных — доступ к памяти без надлежащей блокировки или синхронизации.

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

Helgrind знает обо всех абстракциях pthread и отслеживает их эффекты настолько точно, насколько это возможно. На платформах x86 и amd64 он понимает и частично обрабатывает неявную блокировку, возникающую из-за использования префикса инструкции БЛОКИРОВКИ.

Helgrind работает лучше всего, когда ваше приложение использует только POSIX pthreads API. Однако, если вы хотите использовать пользовательские примитивы потоковой обработки, вы можете описать их поведение в Helgrind с помощью макросов ANNOTATE_*, определенных в helgrind.h. Эта функциональность была добавлена в выпуске 3.5.0 Valgrind и считается экспериментальной.