Comment faire fonctionner Linux 'perf record' pour les symboles libc et libstdc ++?

12

J'utilise perf record -gsur x86-64 Linux pour profiler un programme. Plusieurs symboles dans libc ou libstdc ++ ont 0pour parent: __GI___strcmp_ssse3(libc) et strcmp@plt(libstdc ++) par exemple. (Je peux en fait casser ces symboles dans le débogueur et obtenir une trace.)

J'aimerais savoir quels sont les principaux appelants de ces fonctions et pourquoi elles ne sont pas enregistrées. Est-ce parce que libc et libstdc ++ n'ont pas de pointeurs de trame sur x86_64? Et, plus concrètement, y a-t-il un moyen de contourner cela?

Benjamin Redelings
la source

Réponses:

5

C'est une vieille question, mais c'est désormais possible avec --call-graph dwarf. Depuis la page de manuel:

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

Je crois que cela nécessite un noyau Linux quelque peu récent (> = 3.9? Je ne suis pas tout à fait sûr). Vous pouvez vérifier si le paquetage perf de votre distribution est lié à libdw ou libunwind avec readelf -d $(which perf) | grep -e libdw -e libunwind. Sur Fedora 20, perf est lié à libdw.

ajduff574
la source
perf record --call-graph dwarfrésout ce problème pour moi. malheureusement, il semble que perf ait des problèmes pour afficher des graphiques d'appel basés sur l'appelant (c'est-à-dire "inversés") lors de l'utilisation d'informations naines. C'est pourquoi j'ai commencé à utiliser FlameGraph pour la visualisation.
bleu
noter que l'utilisation du déroulement nain entraîne des frais généraux très importants lors du profilage
Azsgy
-2

perfest un outil du noyau qui affiche le temps écoulé pour les appels système. Vous recherchez GNU gprof. msgstr "gprof - affiche les données du profil du graphique d 'appel". Pour utiliser gprof, vous devez compiler vos sources avec le -pgcommutateur.

En plus de cela, il existe de nombreux outils de profilage sophistiqués comme eclipse-cdt-profiling-framework.


la source