2012-06-12 2 views
6

ich meine letzte „done“ Nachricht mit valgrind, und nutzen Sie diesen Ausgang Bericht:Speicherzugriffsfehler ohne valgrind

==3434== HEAP SUMMARY: 
==3434==  in use at exit: 8,432 bytes in 4 blocks 
==3434== total heap usage: 4,369 allocs, 8,037 frees, 377,356 bytes allocated 
==3434== 
==3434== LEAK SUMMARY: 
==3434== definitely lost: 152 bytes in 1 blocks 
==3434== indirectly lost: 0 bytes in 0 blocks 
==3434==  possibly lost: 0 bytes in 0 blocks 
==3434== still reachable: 8,192 bytes in 2 blocks 
==3434==   suppressed: 88 bytes in 1 blocks 
==3434== Rerun with --leak-check=full to see details of leaked memory 
==3434== 
==3434== For counts of detected and suppressed errors, rerun with: -v 
==3434== ERROR SUMMARY: 100190 errors from 140 contexts (suppressed: 0 from 0) 

Aber wenn ich es ohne valgrind laufen, es Segfaults sofort. Stoppt Valgrind eine bestimmte Art von Fehlern, nach denen ich suchen sollte? Ich kann keine Informationen online finden

+1

Irgendwelche "ungültigen gelesenen" oder "ungültigen Schreiben" im Valgrind-Ausgang? –

+0

Tonnen von ihnen. Die müssen schlecht sein. – SetSlapShot

+2

Ja. Sie meinen, Sie lesen oder schreiben Erinnerungen, die nicht Ihnen gehören. Ich muss sie alle reparieren. –

Antwort

4

Valgrind führt das Programm in einer anderen Umgebung als wenn Sie es aus der Shell ausführen. Dies kann einige Abstürze im Zusammenhang mit der Speicherauslastung oder dem Array-Outbound verhindern.

Korrigieren Sie Ihre 140 Kontexte von Fehlern und Sie werden in Ordnung sein.

3

Memcheck führt keine Überprüfung der vollständigen Grenzen durch, und weil es über einen eigenen Speicherzuordner verfügt, unterdrückt es möglicherweise Fehler, die Sie andernfalls erhalten würden. Verwenden Sie stattdessen einen Debugger.

1

Ein Beispiel für einen Fehler, der manchmal nicht von Valgrind abgefangen wird, ist, wenn Sie Speicher freigeben und dann durch einen anderen Zeiger verweisen, der auch auf die gleiche Stelle zeigte.

Ich bin nicht sicher, warum das passiert. Vielleicht behandelt die Valgrind-Umgebung die Speicherzuweisung und -zuordnung unterschiedlich. [Wie Eredrith sagt]

Eine schnelle Möglichkeit, dies zu überprüfen, wäre es, Ihre free() -Funktionsaufrufe vorübergehend zu kommentieren und zu sehen, ob es immer noch segfold ist. [Kommentieren Sie sie später, sobald Sie sie behoben haben!]