Come far funzionare linux 'perf record' per i simboli libc e libstdc ++?


12

Sto usando perf record -gsu Linux x86-64 per profilare un programma. Diversi simboli in libc o libstdc ++ hanno 0come genitore: __GI___strcmp_ssse3(libc) e strcmp@plt(libstdc ++) per esempio. (Posso effettivamente rompere questi simboli nel debugger e ottenere un backtrace.)

Mi piacerebbe sapere quali sono i principali chiamanti di queste funzioni e perché non sono registrati. Questo perché libc e libstdc ++ non hanno puntatori di frame su x86_64? E, più praticamente, c'è un modo per aggirare questo?

Risposte:


5

Questa è una vecchia domanda, ma questo ora è possibile con --call-graph dwarf. Dalla pagina man:

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

Credo che ciò richieda un kernel Linux piuttosto recente (> = 3.9? Non sono del tutto sicuro). Puoi controllare se il pacchetto perf della tua distro è collegato con libdw o libunwind con readelf -d $(which perf) | grep -e libdw -e libunwind. Su Fedora 20, perf è collegato con libdw.


perf record --call-graph dwarfrisolve questo problema per me. sfortunatamente, sembra che perf abbia problemi a mostrare grafici di chiamata basati sul chiamante (cioè "invertiti") quando si usano informazioni nane. Ecco perché ho iniziato a utilizzare FlameGraph per la visualizzazione.
blu,

si noti che l'utilizzo dello svolgersi dei nani causa un sovraccarico molto significativo durante la profilazione
Azsgy,

-2

perfè uno strumento del kernel che mostra il tempo trascorso per le chiamate di sistema. Stai cercando GNU gprof. msgstr "visualizza i dati del profilo del grafico delle chiamate". Per usare gprof devi compilare i tuoi sorgenti con lo -pgswitch.

Oltre a questo ci sono molti sofisticati strumenti di profilazione come eclipse-cdt-profiling-framework.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.