2012-11-27 3 views
10

Ich entwickle eine statisch verknüpfte 64-Bit-C++ - Anwendung auf 64-Bit-CentOS 5.8 unter Verwendung der Standard-gcc 4.4-Pakete aus den CentOS-Repositories. Es scheint mehr Speicher zu verwenden, als ich erwartet hatte, also habe ich versucht, die Speicherbelegung mithilfe von Massiv darzustellen. Ich habe mit Debug-Informationen kompiliert und dannValgrinds Massif-Tool profiliert meine Anwendung nicht

valgrind --tool = laufen ./MyProg

aus dem Verzeichnis Massiv, wo myprog befindet. Es erzeugt keine anderen Ergebnisse als das folgende Beispiel "massif.out.XXXX".

Beachten Sie, dass das der gesamte Inhalt der Datei ist und mein Programm für viele Minuten ausgeführt werden kann.

Ich habe verschiedene Möglichkeiten versucht, valgrind und massiv vergeblich. Ich habe sogar versucht, den absoluten Pfad zu MyProg zu verwenden, nur für den Fall. Ich habe versucht, die neueste stabile Version von Valgrind (3.8.1) herunterzuladen und das zu kompilieren und auszuführen (da CentOS 3.5.0 verwendet) mit dem gleichen Ergebnis. Als Plausibilitätsprüfung lief ich

valgrind --tool = Massiv ls -l

und es erzeugt mehrere Snapshots mit Nicht-Null-Speichernutzung, wie erwartet.

Ich habe versucht, online mit jeder Kombination von Keywords, die ich denken konnte, aber keine ähnlichen Probleme gefunden.

Als eine Randnotiz, kann ich die Anwendung mit Valgrinds Standard-Memcheck-Tool erfolgreich profilieren, falls das nützliche Informationen sind.

Weiß jemand, warum Massiv meine Anwendung nicht profilieren würde?

+0

Ist Ihr Programm statisch verknüpft? Wenn Sie ein "ldd ./MyProg" machen, listet es eine Reihe von gemeinsam genutzten Bibliotheken auf oder druckt es nichts? –

+0

Es ist statisch verknüpft. Ich habe die Frage bearbeitet, um dies zu klären. – Tyson

Antwort

9

Wenn die Anwendung statisch verknüpft ist, kann sie nicht mit valgrind analysiert werden. Valgrind bietet eine eigene Version der Zuordnungsfunktionen für Ihr Programm, die durch Überschreiben der dynamischen Suche ausgeführt wird.

Wenn Sie dynamisch mit den Standardbibliotheken (libc und libstdC++) verknüpfen können, sollte es wahrscheinlich in der Lage sein, die Speicheranalyse durchzuführen, nach der Sie suchen.

Vom Valgrind FAQ:

Zweitens, wenn Ihr Programm statisch verknüpft ist, die meisten Valgrind Tools nicht so gut funktionieren, weil sie nicht bestimmte Funktionen ersetzen können, wie malloc, mit ihrem eigene Versionen.

+0

Danke. Ich habe diesen Teil der FAQ übersehen. Nach dem Wechsel zur partiellen dynamischen Verknüpfung kann ich ein Profil erstellen. – Tyson

+0

Basierend auf einer [Konversation] (http://thread.gmane.org/gmane.comp.debugging.valgrind/12653) auf der valgrind-users-Mailingliste sollte valgrind in der Lage sein, statisch verknüpfte Anwendungen ab Version 3.8.1 zu analysieren auf. Wie auf der Mailingliste gefordert, habe ich einen [Bug] (https://bugs.kde.org/show_bug.cgi?id=311093) darüber eingereicht. – Tyson