Wie mache ich Linux 'Perf Record' für libc und libstdc ++ Symbole?

12

Ich verwende perf record -gauf x86-64 Linux, um ein Programm zu profilieren. Einige Symbole in libc oder libstdc ++ haben 0als Eltern: __GI___strcmp_ssse3(libc) und strcmp@plt(libstdc ++) zum Beispiel. (Ich kann diese Symbole im Debugger tatsächlich unterbrechen und einen Backtrace abrufen.)

Ich würde gerne wissen, was die wichtigsten Anrufer dieser Funktionen sind und warum sie nicht aufgezeichnet werden. Liegt das daran, dass libc und libstdc ++ keine Frame-Zeiger auf x86_64 haben? Und, praktischer, gibt es einen Weg, dies zu umgehen?

Benjamin Redelings
quelle

Antworten:

5

Dies ist eine alte Frage, aber dies ist jetzt möglich mit --call-graph dwarf. Von der Manpage:

 -g
       Enables call-graph (stack chain/backtrace) recording.

   --call-graph
       Setup and enable call-graph (stack chain/backtrace) recording, implies -g.

           Allows specifying "fp" (frame pointer) or "dwarf"
           (DWARF's CFI - Call Frame Information) as the method to collect
           the information used to show the call graphs.

           In some systems, where binaries are build with gcc
           --fomit-frame-pointer, using the "fp" method will produce bogus
           call graphs, using "dwarf", if available (perf tools linked to
           the libunwind library) should be used instead.

Ich glaube, dies erfordert einen etwas neueren Linux-Kernel (> = 3.9? Ich bin mir nicht ganz sicher). Sie können überprüfen, ob das Perf-Paket Ihrer Distribution mit libdw oder libunwind with verknüpft ist readelf -d $(which perf) | grep -e libdw -e libunwind. Auf Fedora 20 ist perf mit libdw verknüpft.

ajduff574
quelle
perf record --call-graph dwarflöst dieses Problem für mich. Leider scheint es, dass perf Probleme hat, Caller-basierte (dh "invertierte") Call-Graphen anzuzeigen, wenn Zwerginformationen verwendet werden. Deshalb habe ich angefangen, FlameGraph für die Visualisierung zu verwenden.
blau
-2

perfist ein Kernel-Tool, das die verstrichene Zeit für Systemaufrufe anzeigt. Sie suchen nach GNU gprof. msgstr "gprof - Anrufdiagramm - Profildaten anzeigen". Um gprof zu verwenden, müssen Sie Ihre Quellen mit dem -pgSchalter kompilieren .

Daneben gibt es viele ausgefeilte Profilierungswerkzeuge wie eclipse-cdt-profiling-framework.


quelle