
Welche Strategie verwenden Sie beim Verfolgen eines Speicherproblems? Welche Tools (Open Source sowie proprietäre) verwenden Sie, um Speicherlecks, Speicherbeschädigungen usw. zu identifizieren? Wie würden Sie Speicherlecks verfolgen, wenn auf einem System nur gdb/dbx verfügbar wäre?
Für mich ist das Beheben von Speicherlecks nur mit einem Debugger sehr schwierig.
Antwort1
Wenn Sie den Quellcode ändern können,Dmallocist großartig; es listet auf, welche Zeiger freigegeben wurden und (bei mit Debugsymbolen erstelltem Code) in welcher Zeile sie genau zugewiesen wurden.
Wenn Sie das nicht können,Valgrindist so ziemlich der Standard für diese Art von Dingen. Ich finde Valgrind im Allgemeinen etwas schwieriger zu verwenden, aber es hat viel mehr Funktionen und erfordert keine Einfügen von dmalloc-Aufrufen in Ihren Code
Antwort2
Valgrind ist unglaublich hilfreich.
Antwort3
Massiv(von Valgrind) ist eine der besten Möglichkeiten, Speicherlecks zu finden. Wiederholen Sie Ihren verdächtigen Code (oder führen Sie Ihr Programm lange genug aus) und geben Sie das Ergebnis mit ms_print aus. Normalerweise gibt Ihnen der Aufrufstapel genügend Informationen, um das Problem zu beheben.
Mit GDB können Sie versuchen, sich an ein laufendes Programm anzuhängen und Funktionen aufzurufen wiemalloc_stats()
Wenn Ihr Programm in einer anderen Sprache geschrieben ist, kann es schwieriger sein. In letzter Zeit hat GDB die Skriptfähigkeit erlangt und es wurden interessante Projekte gestartet, wie zum BeispielGDB-Heap, das den Python-Speicher aus einem Core Dump analysieren kann. Ähnliche Speicheranalyseskripte sind möglicherweise für C++-Objekte möglich.
Lesen Sie auchhttps://stackoverflow.com/questions/2564752/examining-cc-heap-memory-statistics-in-gdb
Antwort4
Ich arbeite seit einiger Zeit mit Objective-C und es gibt einen Analysator, der sich mit Speicherverwaltung auf C-Ebene und ähnlichen Dingen befasst.Clang Statischer Analysatorist so gut, dass Apple beschlossen hat, es mit seiner xCode IDE zu bündeln. Ich bin nicht sicher, ob das für Ihre Frage gut ist, aber wenn Sie C verwenden, ist es einen Versuch wert.