Ich habe versucht, Valgrind 3.13 und 3.14 (auf MacOs 10.12.6) in einem sehr einfachen Projekt zu starten, aber ich habe einen seltsamen Fehler, den ich nie zuvor in meinem Linux bekommen habe.
Sehr einfaches C-Programm main.c
:
Zusammenstellung mit cc
:
Führen Sie mein einfaches Programm mit valgrind
:
Ausgabe von valgrind:
%Vor%Ich verstehe diesen Teil der Spur nicht:
%Vor%Ich verstehe nicht, warum die Zusammenfassung des Heapspeichers so groß ist (178 Allocs, 16 Frees, 24288 Bytes, die zugewiesen wurden) meiner einfachen Rückgabe (0); Programm.
Valgrind verfügt über ein System zur Fehlerunterdrückung. Unterdrückungsregeln sind in speziellen Dateien angegeben, zum Beispiel $PREFIX/lib/valgrind/default.supp
. Benutzer können ihre eigenen Regeln mit Hilfe der --gen-suppressions=full
aid erstellen, die für jeden gefundenen Fehler eine Unterdrückungsregel ausgibt. Der Benutzer kann es dann an seine eigenen Bedürfnisse anpassen.
Ich habe das für den fraglichen Fehler gemacht, und es funktioniert großartig! Keine Notwendigkeit, instabile Versionen zu installieren. Dies ist auch ein gutes Werkzeug im Gürtel, wenn Sie auf andere gemeldete Fehler stoßen, die Sie ignorieren möchten.
Ich habe diese Datei als ~/.valgrind.supp
gespeichert.
#
startet einen Kommentar und {}
kennzeichnet eine Regel. Die erste Zeile ist der Name der Regel. Die zweite sagt, welches Werkzeug und welcher Fehlertyp unterdrückt werden soll. Param
bedeutet ungültiger Syscall-Parameter, und die nächste Zeile gibt den Parameter an, für den Fehler unterdrückt werden sollen. Die folgenden Zeilen, beginnend mit fun:
, bedeuten, dass diese Unterdrückungsregel nur in mach_msg_trap
gilt, wenn sie von mach_msg
aufgerufen wird und von task_set_special_port
aufgerufen wird. Auf diese Weise unterdrücken wir nur den Fehler in diesem sehr speziellen Fall, in dem Valgrind die libtrace-Initialisierung für einen Fehler vereitelt.
Valgrind verwendet diese Regel, wenn Sie das Argument --suppressions=$HOME/.valgrind.supp
in der Befehlszeile angeben oder in $VALGRIND_OPTS
oder ~/.valgrindrc
einfügen.
Ich habe gerade den Fehlerstatus hier überprüft und es scheint gelöst zu sein , also habe ich gerade das entsprechende Commit ausgecheckt und kompiliert. Es löst das Problem der nicht initialisierten Bytes, verursacht aber neue Probleme: unbehandeltes MACH_SEND_TRAILER?
1) Klon-Master-Zweig
%Vor%2) patchen Sie es mit dem Fix:
%Vor%3) konfigurieren Sie kompilieren und installieren Sie wie gewohnt, Anweisungen hier
4) testen Sie es mit einem einfachen Programm
%Vor%Derselbe Test, der unter Linux Ubuntu 16.04 mit valgrind 3.11.0 durchgeführt wurde, liefert eine saubere Ausgabe.