Dois-je utiliser Helgrind ou DRD pour la détection des erreurs de thread?
On dirait que Valgrind a deux outils qui détectent les erreurs de thread: Helgrind et DRD. Ces outils sont essentiellement similaires.
Ma question principale est: quand devrais-je utiliser l'un au lieu de l'autre pour vérifier mon code multi-thread?
Plus largement, pourquoi y a-t-il deux outils? Je suppose qu'ils ne sont pas entièrement redondants. Quelles sont les différences importantes? Devrais-je généralement planifier l'exécution de mon code via les deux outils?
4 réponses
Alors que Helgrind peut détecter les violations de l'ordre de verrouillage, pour la plupart des programmes, DRD a besoin de moins de mémoire pour effectuer son analyse. En outre, DRD prend en charge les threads détachés. Il y a aussi des différences plus subtiles - comparez les manuels respectifs si vous voulez en savoir plus. Voir aussi http://valgrind.org/docs/manual/hg-manual.html et http://valgrind.org/docs/manual/drd-manual.html.
Si vous utilisez des primitives de synchronisation POSIX en plus des Mutex (par exemple, sémaphores, barrières, variables de condition, etc.), DRD vaut le coup - il peut identifier certains abus subtils que Helgrind ne détecte pas.
Cependant, DRD semble être beaucoup plus gourmand en ressources que Helgrind (dans Mes exécutions en utilisant 3.14.0, il semble y avoir une énorme quantité de surcharge CPU).
Quand devrais-je utiliser l'un au lieu de l'autre pour vérifier mon code multi-thread?
Dépend de pour quoi vous voulez vérifier ce code.
Pour vérifier les courses de données, vous pouvez utiliser ThreadSanitizer .
comparaison avec DRD et autres .
Un autre point à considérer: à partir de la version 3.6.0 de valgrind, DRD supporte les spinlocks pthread, mais pas helgrind. Je n'ai pas essayé la version 3.7.0, mais les notes de version me portent à croire que cela n'a pas changé.