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

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

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

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

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

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

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

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

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

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

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