2011-01-14 18 views
20

Ich kenne Valgrind, aber es erkennt nur Speicherverwaltungsprobleme. Was ich suche, ist ein Werkzeug, das mir einen Überblick gibt, welche Teile meines Programms wie viel Speicher verbrauchen. Eine graphische Darstellung mit z.B. eine Baumkarte (wie KCachegrind für Callgrind tut) wäre cool.Wie Profil Speicherverbrauch?

Ich arbeite an einer Linux-Maschine, so dass Windows-Tools mir nicht sehr helfen werden.

Antwort

20

Verwenden Sie massif, das Teil der Valgrind-Tools ist. massif-visualizer kann Ihnen helfen, die Daten grafisch darzustellen, oder Sie können einfach den Befehl ms_print verwenden.

+0

Danke, die Screenshots sehen sehr gut aus ..., ich denke, das ist, was ich schon immer wollte. – math

4

Testen Sie die heap profiler, die mit gperftools von Google geliefert wird. Ich habe es immer aus Quellen gebaut, aber es ist als precompiled package unter mehreren Linux-Distributionen verfügbar.

Es ist so einfach zu verwenden, wie eine dynamische Bibliothek zu Ihren ausführbaren Dateien zu verbinden und das Programm auszuführen. Es sammelt Informationen über jede dynamische Speicherzuweisung (soweit ich gesehen habe) und jedes Mal, wenn einer der folgenden Ereignisse eintritt auf der Festplatte ein Speicherabbild speichern:

  • HEAP_PROFILE_ALLOCATION_INTERVAL Bytes vom Programm zugewiesen wurde (default : 1 Gb)
  • die Hochwasserspeichernutzung Zeichen erhöht sich um HEAP_PROFILE_INUSE_INTERVAL Bytes (Standard: 100 MB)
  • HEAP_PROFILE_TIME_INTERVAL Sekunden verstrichen sind (Standard: deaktiviert)
  • Sie rufen explizit HeapProfilerDump() aus dem Code

Die letzte, in meiner Erfahrung ist das nützlichste, weil Sie genau steuern können, wenn eine Momentaufnahme der Heap-Nutzung und dann zwei verschiedene Schnappschüsse vergleichen haben und sehen, was falsch ist.

Schließlich gibt es mehrere mögliche Ausgabeformate, wie Text- oder Grafik (in Form eines gerichteten Graphen):

Graph of memory usage

Mit diesem Tool ich konnte habe falsche Speicher Verbräuche erkennen, dass Ich konnte das Massiv nicht finden.