Как можно определить условия гонки в Linux? - PullRequest
1 голос
/ 05 ноября 2011

Какими инструментами вы пользовались для определения состояния гонки для многопоточных программ в Linux.

Я использую инструмент helgrind из valgrind , но я заметил, что иногда он не соответствует условиям гонки.

Ответы [ 3 ]

2 голосов
/ 06 ноября 2011

Вы можете попробовать ThreadSanitizer .

Он отличается от от Helgrind тем, что в гибридном режиме он "может давать больше ложных срабатываний, но намного быстрее, более предсказуем и находит больше реальных рас".

1 голос
/ 06 ноября 2011

Вы также можете использовать DRD инструмент Valgrind вместе с helgrind . Хотя я не пробовал DRD , он должен обнаружить некоторые ошибки, пропущенные helgrind - так что стоит использовать оба инструмента, чтобы обнаружить больше ошибок.

1 голос
/ 05 ноября 2011

Редактировать Я почему-то упустил, что вы упомянули Helgrind.Однако в моем тексте есть указания на то, почему helgrind может пропустить такие случаи.

Вы можете использовать helgrind из инструментария valgrind

Helgrind - это инструмент Valgrind для обнаружения ошибок синхронизации в программах на C, C ++ и Fortran, использующих потоковые примитивы POSIX pthreads.

Основные абстракции в pthreads POSIX: набор потоков, разделяющих общее адресное пространство, потоксоздание, присоединение к потоку, выход из потока, мьютексы (блокировки), условные переменные (уведомления о событиях между потоками), блокировки чтения-записи, спин-блокировки, семафоры и барьеры.

Helgrind может обнаруживать три класса ошибок, которые:подробно обсуждается в следующих трех разделах:

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

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

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

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

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

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

...