web-dev-qa-db-de.com

Memory / Address Sanitizer gegen Valgrind

Ich möchte ein Tool zum Diagnostizieren von Bugs, die nach der Installation des Benutzers aufgetreten sind, und von nicht initialisierten Bugs. Ich denke über Sanitizer (Speicher und/oder Adresse) und Valgrind nach. Aber ich habe sehr wenig Ahnung von ihren Vor- und Nachteilen. Kann jemand die Hauptmerkmale, Unterschiede und Vor- und Nachteile von Sanitizer und Valgrind beschreiben?

Bearbeiten: Ich fand einige Vergleiche wie: Valgrind verwendet DBI (Dynamic Binary Instrumentation) und Sanitizer verwendet CTI (Compile-Time Instrumentation). Valgrind macht das Programm viel langsamer (20x), ob Sanitizer viel schneller als Valgrind (2x) läuft. Wenn jemand mir einige wichtigere Punkte nennen kann, ist dies eine große Hilfe.

23
kayas

Ich denke, Sie werden das wiki nützlich finden.

TLDR Hauptvorteile von Desinfektionsmitteln sind

  • viel kleinerer CPU-Overhead (Lsan ist praktisch kostenlos, UBsan ist 1,25x, Asan und Msan sind 2-4x für rechenintensive Aufgaben und 1.05-1.1x für GUIs, Tsan ist 5-15x)
  • breitere Klasse erkannter Fehler (Stapel- und globale Überläufe, Use-After-Return)
  • volle Unterstützung von Multithread-Apps (Valgrind-Unterstützung für Multithreading ist ein Witz)

Nachteile sind

  • signifikanter Speicheraufwand (bis zu 2x für Asan, bis zu 3x für Msan, bis zu 10x für Tsan), der ein begrenzender Faktor für ressourcenbeschränkte Umgebungen sein kann (z. B. Telefone); Es ist immer noch viel besser als Valgrind
  • kompliziertere Integration (Sie müssen Ihrem Build-System beibringen, Asan zu verstehen und manchmal Einschränkungen/Fehler in Asan selbst zu umgehen. Sie müssen auch einen relativ aktuellen Compiler verwenden.)
  • MemorySanitizer ist momentan nicht einfach zu verwenden, da es erforderlich ist, alle Abhängigkeiten unter Msan (einschließlich aller Standardbibliotheken, z. B. libstdc ++) neu zu erstellen. Dies bedeutet, dass gelegentliche Benutzer Valgrind nur zum Erkennen nicht initialisierter Fehler verwenden können
  • desinfektionsmittel können normalerweise nicht miteinander kombiniert werden (die einzige unterstützte Kombination ist Asan + UBsan + Lsan), was bedeutet, dass Sie separate QS-Läufe durchführen müssen, um alle Arten von Fehlern zu erkennen
28
yugr

Ein großer Unterschied besteht darin, dass die in LLVM enthaltenen Desinfektionsprogramme Speicher und Thread implizit große Bereiche des Adressraums abbilden (z. B. durch Aufrufen von mmap(X, Y, 0, MAP_NORESERVE|MAP_ANONYMOUS|MAP_FIXED|MAP_PRIVATE, -1, 0) über Terabytes von Adressen Speicherplatz in der x86_64-Umgebung). Auch wenn sie diesen Speicher nicht unbedingt zuweisen, kann die Zuordnung in restriktiven Umgebungen (z. B. mit angemessenen Einstellungen für ulimit -Werte) zu Problemen führen.

0
jhfrontz