Profiling von c ++ auf Mac OS X.

69

Ich versuche, C ++ - Code auf meinem Mac (os x Lion) zu profilieren, und konnte nichts Nützliches finden. Ich suche einen Profiler, der mir sagt, welche Funktionen meine CPU-Zeit beanspruchen (ähnlich dem Matlab-Profiler).

Folgendes habe ich versucht

  • gprof. Dies ist, was ich auf meinem Linux-Computer verwende, aber es gibt mir nur leere Ausgabe auf meinem Mac (anscheinend ein bekanntes Problem)
  • Instrumente. Ich kann für mein ganzes Leben nicht herausfinden, wie ich irgendetwas in meiner kompilierten Binärdatei profilieren kann. Ich kann auch kein nützliches Tutorial finden.
  • (Andere Suchanfragen ergaben, dass Shark nicht mehr verfügbar ist und Valgrind für die Erinnerung).

Wirklich dankbar für die Hilfe!

Nebel
quelle
Sie können dies aus diesen Gründen versuchen .
Mike Dunlavey
MikeDunlaveys Kommentar deutet schräg darauf hin, dass Sie Ihr Programm in gdb (oder einem anderen Debugger, wenn Sie herausfinden können, wie) öffnen und es in regelmäßigen Abständen manuell unterbrechen, um im Grunde zu simulieren, was gprof / Instruments für Sie tun würde, aber mit mehr geistiger Belastung. Verwenden Sie stattdessen einfach Instrumente. Eine schrittweise Anleitung finden Sie in der Antwort von @ duskwuff unten.
Quuxplusone
@Quuxplusone: Mein schiefer Vorschlag findet Beschleunigungsmöglichkeiten, die gprof / Instruments nicht bieten. Instruments tastet den Aufrufstapel ab, aber soweit ich das beurteilen kann, können Sie einzelne Stapelstichproben nicht tatsächlich untersuchen. So finden Sie die Beschleunigungen. Vielmehr (es sei denn, ich irre mich) wird das Konzept des "heißen Pfades" berücksichtigt, und in Nicht-Spielzeug-Programmen jeder anständigen Größe können sich große Probleme leicht vor dem heißen Pfad verbergen.
Mike Dunlavey
@Quuxplusone: Hier erfahren Sie, wie Sie den Hot Path erstellen. Nehmen Sie alle Proben durch Haupt (100%). Finden Sie von diesen die Routine, die am häufigsten von main aufgerufen wird (nennen Sie es A ), und nehmen Sie an, dass sie sich auf 30% der Stichproben befindet. Andere Funktionen könnten auf den anderen 70% liegen, aber jeweils weniger als A genannt . Suchen Sie von diesen Stichproben die von A am häufigsten aufgerufene Routine (nennen Sie sie B ), und nehmen Sie an, dass sie bei 30% dieser Stichproben liegt. OK, also ist die Sequenz main-AB 30% mal 30% = 9% der Proben. Alles außerhalb dieser 9% wird nicht bemerkt. Man merkt, dass man nach ein paar Levels vieles nicht mehr sieht.
Mike Dunlavey
iprofiler von BSD ist nett, da seine Ausgabe in Instruments geöffnet werden kann.
Entalpi

Antworten:

113

Instrumente ist das zu verwendende Werkzeug. Eine vollständige Erläuterung der Instrumente liegt außerhalb des Rahmens dieser Antwort. Hier ist jedoch eine Kurzanleitung:

  1. Instrumente öffnen. 1
  2. Wählen Sie die Vorlage "Zeitprofiler".
  3. Wählen Sie Ihre Anwendung im Dropdown-Menü "Ziel". 2
  4. Klicken Sie auf den roten Kreis ("Aufnahme"), um die Anwendung zu starten.
  5. Führen Sie gegebenenfalls in Ihrer Anwendung einige Dinge aus, die Sie profilieren müssen.
  6. Drücken Sie die Aufnahmetaste erneut, um die Aufnahme zu beenden.
  7. Verwenden Sie die Tools in Instruments, um Ihre Ergebnisse zu analysieren.

Von den verfügbaren Tools sind die am häufigsten nützlichen:

  • Erweitern des Anrufbaums mithilfe der Offenlegungspfeile
  • Klicken Sie auf den eingekreisten Pfeil eines Funktionsnamens, um ihn zu fokussieren
  • Doppelklicken Sie auf eine Funktion, um die zugehörige Quelle anzuzeigen
  • Das Kontrollkästchen "Anrufbaum umkehren" auf der linken Seite

Sie können einen Aufruf von auch instrumentsüber die Befehlszeile starten :

instruments -l 30000 -t Time\ Profiler -p 5773

siehe Anleitung .


1 Eine einfache Möglichkeit, Instrumente zu öffnen, ist die Verwendung von Spotlight: Klicken Sie einfach auf die Lupe in der oberen rechten Ecke der Taskleiste (neben der Uhr) und geben Sie "Instrumente" ein.

2 Klicken Sie auf "Ziel auswählen ..." und navigieren Sie zum Pfad Ihrer ausführbaren Datei.

Dämmerung -inaktiv-
quelle
Hallo @duskwuff, genau das habe ich getan, aber mein Stack-Trace ist leer. Da ist absolut nichts. Meine Anwendung ist ein Befehlszeilentool, das nach etwa 30 Sekunden beendet werden sollte. Instruments wird jedoch einfach fortgesetzt. Außerdem kann ich anscheinend keine Befehlszeilenausgabe finden (nicht, dass dies notwendig ist, aber es wäre ein guter Hinweis darauf, dass mein Programm ausgeführt wird)
Nebel
Hrm… Sie können auch versuchen, das Ziel auf "alle Prozesse" zu setzen und dann Ihr Programm manuell in einem Terminal zu starten, während Instruments ausgeführt wird. Damit können Sie die Daten für Ihr Programm aus allen anderen Stichproben herausfischen. Klicken Sie in den Ergebnissen einfach auf den Kreispfeil auf den Namen Ihres Werkzeugs.
Abenddämmerung -inaktiv-
3
Zu Ihrer Information, ich habe gerade etwas über das iprofilerCLI-Tool zum Sammeln von Traces gelernt , die mit der Instruments-App angezeigt werden können. Es ist nicht leicht, es zu entdecken, da man -k profileres nicht in den Ergebnissen enthalten ist.
Kurtis Rader
2
Dies kann auch über die Befehlszeile verwendet werden instruments. Beispiel: instruments -t "Time Profiler" ./a.out foo.txt 20- Dies ist einfacher als das Festlegen von Argumenten und Arbeitsverzeichnissen in der GUI. Danach kann das Ergebnis instrumentscli0.traceüber die Instruments-GUI geöffnet werden, oder sogar das (Öffnen in der GUI) kann über die Befehlszeile erfolgen:open -a Instruments instrumentscli0.trace
ShreevatsaR
8

Instrumente ist das zu verwendende Werkzeug. Stellen Sie sicher, dass Sie Instrumente in XCode öffnen, um das Problem der leeren Traces zu beheben:

Xcode > Open Developer Tool > Instruments

Wenn Sie Instrumente über ein altes Instrumentensymbol öffnen, das Sie vor der letzten Aktualisierung von XCode an Ihr Dock angeheftet haben, werden leere Spuren angezeigt.

Chutney
quelle
1
Tatsächlich. Das hat das Problem mit dem leeren Anrufbaum für mich gelöst. Vielen Dank!
Bsumirak
1
Dies scheint die einzige Möglichkeit zu sein, Instrumente jetzt zu starten (außer natürlich über die Befehlszeile). Es wird nach den letzten Betriebssystem-Upgrades nicht mehr im Rampenlicht angezeigt. Ich bin mir nicht sicher, wann sich das geändert hat.
Bryn Keller
8

Instrumente sind wirklich die richtige Antwort. Wenn Sie jedoch nicht herausfinden können, wie sie verwendet werden sollen, ist der Profiler in der integrierten Aktivitätsüberwachungsanwendung eine weitere Option. Im Aktivitätsmonitor können Sie Informationen zu jedem laufenden Prozess abrufen und es gibt eine Schaltfläche, mit der Sie die Ausführung für eine Weile testen können. Sie müssen Ihr Programm starten, zum Aktivitätsmonitor wechseln, den Prozess suchen und ihn dann testen.

Darüber hinaus können Sie die Profilerstellung für arme Männer durchführen, indem Sie das Programm einfach in einem Debugger ausführen und es etwa ein halbes Dutzend Mal manuell anhalten und den Aufrufstapel zu diesen Zeiten notieren. Es ist sehr einfach, funktioniert aber überraschend gut als erster Durchgang für einen erheblichen Teil der Programme.

Es gibt auch ein Befehlszeilenprogramm, sampledas den Callstack wie die anderen abtastet.

bames53
quelle