So verfolgen / beheben Sie ein Speicherproblem in einem großen C / C ++ - Code auf * nix-Systemen

9

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.

Hemant
quelle
2
Persönlich denke ich, dass diese Frage mehr mit der Programmierung als mit Unix zu tun hat.
Phunehehe

Antworten:

12

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

Michael Mrozek
quelle
dmalloc ist in sehr großen Systemen nicht sehr leistungsfähig, wie erwartet. Valgrind ist eine bessere Wahl, und selbst dort werden Sie Engpässe treffen ...
valgrind --tool memcheck "yourapp" gibt zur Laufzeit speicherbezogene Informationen aus (nützlich in Desktop-Systemen). Ein weiteres großartiges Tool ist memwatch , das jedoch zusammen mit Ihrer Quelle kompiliert werden sollte. Memwatch kann Details in einer Datei protokollieren und eignet sich daher besser für eingebettete Systeme.
Rajaganesh87
7

valgrind ist unglaublich hilfreich.

Jacksonh
quelle
2

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

Elmarco
quelle
1

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).

alanc
quelle
1

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.

Phunehehe
quelle
Kleiner Streit: clang wurde von Anfang an für die Verwendung in xcode entwickelt. Siehe clang.llvm.org/clang_video-05-25-2007.html
Daniel James
Hallo Daniel, das mag wahr sein, aber es war bis vor kurzem nicht in xCode enthalten (oder zumindest nicht in dem Bundle, das ich von Apple heruntergeladen habe)
phunehehe