Welche Strategie verwenden Sie beim Verfolgen eines Speicherproblems? Welche Tools verwenden Sie (sowohl Open Source als auch proprietär), um Speicherlecks, Speicherbeschädigungen usw. zu identifizieren? Wie würden Sie Speicherlecks verfolgen, wenn nur GDB / DBX auf einem System verfügbar wäre?
Für mich ist es sehr schwierig, Speicherlecks nur mit einem Debugger zu beheben.
debugging
memory-leaks
Hemant
quelle
quelle
Antworten:
Wenn Sie den Quellcode ändern können, ist Dmalloc großartig. Es wird aufgelistet, welche Zeiger nicht freigegeben wurden und (für Code mit Debugging-Symbolen) genau, in welcher Zeile sie zugewiesen wurden.
Wenn Sie nicht können, ist Valgrind so ziemlich der Standard für solche Dinge. Ich finde Valgrind im Allgemeinen etwas schwieriger zu verwenden, aber es hat viel mehr Funktionen und beinhaltet nicht das Hinzufügen von dmalloc-Aufrufen zu Ihrem Code
quelle
valgrind ist unglaublich hilfreich.
quelle
Das Massiv (von Valgrind) ist einer der besten Wege, um Speicherlecks zu finden. Wiederholen Sie Ihren verdächtigen Code (oder führen Sie Ihr Programm lange genug aus) und sichern Sie das Ergebnis mit ms_print. Normalerweise gibt Ihnen der Aufrufstapel genügend Informationen, um das Problem zu beheben.
Mit GDB können Sie versuchen, eine Verbindung zu einem laufenden Programm herzustellen und Funktionen wie z
malloc_stats()
Wenn Ihr Programm in einer anderen Sprache geschrieben ist, ist es möglicherweise schwieriger. In letzter Zeit hat einige GDB Skriptfähigkeit erlangt, und die Leute haben interessante Projekte wie gdb-heap gestartet , mit denen Python-Speicher von einem Core-Dump aus analysiert werden kann. Ähnliche Skripte zur Speicheranalyse sind möglicherweise für C ++ - Objekte möglich.
Lesen Sie auch /programming/2564752/examining-cc-heap-memory-statistics-in-gdb
quelle
Für Solaris sind in den Antworten auf diese StackOverflow-Frage mehrere Tools aufgeführt (einschließlich der Leckprüfung bei anderen Formen des fehlerhaften Speicherzugriffs).
quelle
Ich mache seit einiger Zeit Objective-C und es gibt einen Analysator, der sich mit Speicherverwaltung auf C-Ebene und dergleichen befasst. Clang Static Analyzer ist so gut, dass Apple beschlossen hat, es mit seiner xCode-IDE zu bündeln. Ich bin mir nicht sicher, ob dies für Ihre Frage gut ist, aber wenn Sie C machen, ist es einen Versuch wert.
quelle