Должен ли я использовать Helgrind или DRD для обнаружения ошибок потока?

Похоже, у Valgrind есть два инструмента, которые оба обнаруживают ошибки потоков: Helgrind и DRD. Эти инструменты в значительной степени похожи.

Мой основной вопрос: когда я должен использовать один вместо другого, чтобы проверить мой многопоточный код?

В более широком смысле, почему есть два инструмента? Я предполагаю, что они не являются полностью избыточными. Каковы важные различия? Должен ли я вообще планировать запуск своего кода через оба инструмента?

4 ответа

Решение

Хотя Helgrind может обнаруживать нарушения порядка блокировки, для большинства программ DRD требуется меньше памяти для выполнения анализа. Кроме того, DRD поддерживает отдельные потоки. Есть и более тонкие различия - сравните соответствующие руководства, если хотите узнать больше. Смотрите также http://valgrind.org/docs/manual/hg-manual.html и http://valgrind.org/docs/manual/drd-manual.html.

Если вы используете какие-либо примитивы синхронизации POSIX, кроме мьютексов (например, семафоры, барьеры, условные переменные и т. Д.), Стоит попробовать DRD - он может выявить некоторые тонкие злоупотребления, которые Хелгринд не обнаруживает.

Тем не менее, DRD кажется гораздо более ресурсоемким, чем Helgrind (в моих прогонах, использующих 3.14.0, кажется, что загрузка ЦП огромна).

когда я должен использовать один вместо другого, чтобы проверить мой многопоточный код?

Зависит от того, что вы хотите проверить этот код.

Чтобы проверить гонки данных, вы можете использовать ThreadSanitizer.
Сравнение с DRD и др.

Еще один момент, который следует учитывать: в версии valgrind 3.6.0 DRD поддерживает спин-блокировки pthread, а helgrind - нет. Я не пробовал 3.7.0, но заметки о выпуске заставляют меня поверить, что это не изменилось.

Другие вопросы по тегам