Como fazer o 'perf record' do linux funcionar para símbolos libc e libstdc ++?

12

Estou usando o perf record -gLinux x86-64 para criar um perfil de um programa. Vários símbolos na libc ou libstdc ++ têm 0como pai: __GI___strcmp_ssse3(libc) e strcmp@plt(libstdc ++), por exemplo. (Na verdade, posso quebrar esses símbolos no depurador e obter um retorno.)

Gostaria muito de saber quais são os principais chamadores dessas funções e por que elas não são gravadas. Isso ocorre porque libc e libstdc ++ não possuem ponteiros de quadro no x86_64? E, mais praticamente, existe alguma maneira de contornar isso?

Benjamin Redelings
fonte

Respostas:

5

Esta é uma pergunta antiga, mas agora é possível com --call-graph dwarf. Na página do manual:

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

Eu acredito que isso requer um kernel Linux um tanto recente (> = 3.9? Não tenho muita certeza). Você pode verificar se o pacote perf da sua distribuição está vinculado ao libdw ou libunwind readelf -d $(which perf) | grep -e libdw -e libunwind. No Fedora 20, o perf está vinculado ao libdw.

ajduff574
fonte
perf record --call-graph dwarfresolve esse problema para mim. infelizmente, parece que o perf tem problemas para exibir gráficos de chamadas baseados em chamadores (ou seja, "invertidos") ao usar informações de anões. Por isso comecei a usar o FlameGraph para visualização.
azul
observe que o uso do desenrolamento dos anões causa uma sobrecarga muito significativa durante a criação de perfil
Azsgy
-2

perfé uma ferramenta do kernel que mostra o tempo decorrido para chamadas do sistema. Você está procurando o GNU gprof. "gprof - exibe dados do perfil do gráfico de chamadas". Para usar o gprof, você precisa compilar suas fontes com o -pgswitch.

Além disso, existem muitas ferramentas sofisticadas de criação de perfis eclipse-cdt-profiling-framework.


fonte