¿Cómo hacer que Linux 'perf record' funcione para los símbolos libc y libstdc ++?

12

Estoy usando perf record -gLinux x86-64 para perfilar un programa. Varios símbolos en libc o libstdc ++ tienen 0como padre: __GI___strcmp_ssse3(libc) y strcmp@plt(libstdc ++) por ejemplo. (De hecho, puedo romper estos símbolos en el depurador y obtener una traza inversa).

Me encantaría saber cuáles son las principales llamadas de estas funciones y por qué no están grabadas. ¿Es esto porque libc y libstdc ++ no tienen punteros de trama en x86_64? Y, más prácticamente, ¿hay alguna forma de evitar esto?

Benjamin Redelings
fuente

Respuestas:

5

Esta es una vieja pregunta, pero esto ahora es posible con --call-graph dwarf. Desde la página del 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.

Creo que esto requiere un kernel de Linux algo reciente (> = 3.9? No estoy completamente seguro). Puede verificar si el paquete de perf de su distribución está vinculado con libdw o libunwind con readelf -d $(which perf) | grep -e libdw -e libunwind. En Fedora 20, perf está vinculado con libdw.

ajduff574
fuente
perf record --call-graph dwarfresuelve este problema para mí desafortunadamente, parece que perf tiene problemas para mostrar gráficos de llamadas basados ​​en llamadas (es decir, "invertidos") cuando se utiliza información enana. Es por eso que comencé a usar FlameGraph para la visualización.
azul
tenga en cuenta que el uso de desenrollado enano causa una sobrecarga muy significativa durante el perfilado
Azsgy
-2

perfes una herramienta del núcleo que muestra el tiempo transcurrido para las llamadas al sistema. Estás buscando GNU gprof. "gprof - mostrar datos del perfil del gráfico de llamadas". Para usar gprof necesitas compilar tus fuentes con el -pginterruptor.

Además de esto, hay muchas herramientas sofisticadas de creación de perfiles eclipse-cdt-profiling-framework.


fuente