2013-07-01 21 views
6

Ich habe einige der Post in Bezug auf Valgrind gesehen, aber nicht einzelne Post hat mir geholfen, Interpretation der Valgrind-Ausgabe zu verstehen. Ich lief zwei Programme mit valgrind (beide mit Speicherlecks)Fehlerzusammenfassung in Valgrind-Ausgabe?

Beispielausgabe für Test 1

==20422== LEAK SUMMARY: 
==20422== definitely lost: 448 bytes in 3 blocks 
==20422== indirectly lost: 786,460 bytes in 1 blocks 
==20422== possibly lost: 1,576,052 bytes in 46 blocks 
==20422== still reachable: 1,077,107 bytes in 2,333 blocks 
==20422== suppressed: 0 bytes in 0 blocks 
==20422== Rerun with --leak-check=full to see details of leaked memory 
==20422== 
==20422== For counts of detected and suppressed errors, rerun with: -v 
==20422== ERROR SUMMARY: 98307 errors from 5 contexts (suppressed: 2 from 2) 
Killed 

Output für Test 2

==20875== HEAP SUMMARY: 
==20875== in use at exit: 1,059,198 bytes in 2,047 blocks 
==20875== total heap usage: 3,019 allocs, 972 frees, 4,496,090 bytes allocated 
==20875== 
==20875== LEAK SUMMARY: 
==20875== definitely lost: 328 bytes in 2 blocks 
==20875== indirectly lost: 0 bytes in 0 blocks 
==20875== possibly lost: 1,600 bytes in 5 blocks 
==20875== still reachable: 1,057,270 bytes in 2,040 blocks 
==20875== suppressed: 0 bytes in 0 blocks 
==20875== Rerun with --leak-check=full to see details of leaked memory 
==20875== 
==20875== For counts of detected and suppressed errors, rerun with: -v 
==20875== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2) 

Wenn Sie bei den Fehlern Zusammenfassung sehen, ein Ausgang sagt, es gibt Fehler und andere sagt, es gibt keine Fehler (schließlich beide haben Lecks)

Meine Frage ist - - Was wird als Fehler in Valgrind gezählt? (Valgrind Handbuch hat mir nicht geholfen)

+0

Sie gefunden werden sollten, zum Beispiel einiger Fehlermeldungen gehabt haben Ungültiges Lesen vor der Leckzusammenfassung in Ausgang 1, aber 2 wurden unterdrückt – parkydr

+0

Es gab lange Liste von ungültigem Lesen und Schreiben im ersten Code. – Meluha

+0

Verwenden Sie OSX zufällig? – StevenTsooo

Antwort

6

Speicherlecks sind keine Fehler, sie beeinflussen nicht die Logik des Programms.

Fehler sind Dinge wie ungültige Lese- und Schreibvorgänge.

Aktualisiert als Ergebnis des Kommentars: Die ungültigen Lese- und Schreibvorgänge in Test 1 beziehen sich auf 5 verschiedene Speicherbereiche, auf die 98307-mal zugegriffen wird.

Mit Blick auf die Lecks können die großen indirekten Verluste in Test 1 eine verknüpfte Datenstruktur anzeigen, wo nur der Stamm gelöscht wurde.

Die Lecks in Test 2 sind nicht zu schlecht. Wie Valgrind vorschlägt, wiederholen Sie mit --leak-check = full was darauf hinweisen sollte, welches Bit des Codes das Problem verursacht.

kann eine vollständige Erklärung des Fehlers here

+0

Bedeutet es, dass es im ersten Code Speicher gibt, der nicht zugewiesen, aber verwendet wurde, und für den zweiten Code der Speicher zugewiesen, aber nicht freigegeben wurde. – Meluha

+0

Sie müssen sich die tatsächlichen Fehler ansehen, das ungültige Lesen bedeutet nur, dass es irgendwo liest, sollte es nicht lesen, es könnte das Ende des zugewiesenen Speichers ablesen. Die Lecks sind ein separates Problem - definitiv verloren, bedeutet nichts deutet auf diesen Block der Erinnerung, so dass Sie es nicht befreien können, indirekt verloren bedeutet, dass die Zeiger da sind, aber in durchgesickerten Speicher selbst und möglicherweise verloren bedeutet, dass es aussieht, als gäbe es eine Kette von Zeiger auf den Speicher, aber die Zwischenverbindung könnte ein zufälliger Wert sein, der zufällig funktioniert. – parkydr