Должен ли я использовать 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, но заметки о выпуске заставляют меня поверить, что это не изменилось.