2012-05-12 4 views
12

Estoy tratando de perfilar algunos programas C++ en MacOSX. Así que construí google-perftools, escribí un programa, compilado usando MacPorts g ++ 4.7, con -g indicador del compilador, y vinculado a libprofiler. Entonces me encontré:Número de línea en Google Perftools Analizador de CPU en MacOSX

CPUPROFILE=cpu.profile ./a.out 

Entonces me encontré con pprof para generar la salida:

[hidden ~]$ pprof --text ./a.out cpu.profile 
Using local file ./a.out. 
Using local file cpu.profile. 
Removing __sigtramp from all stack traces. 
Total: 282 samples 
    107 37.9% 37.9%  107 37.9% 0x000000010d72229e 
     16 5.7% 43.6%  16 5.7% 0x000000010d721a5f 
     12 4.3% 47.9%  12 4.3% 0x000000010d721de8 
     11 3.9% 51.8%  11 3.9% 0x000000010d721a4e 
     9 3.2% 55.0%  9 3.2% 0x000000010d721e13 
     8 2.8% 57.8%  8 2.8% 0x000000010d721a64 
     7 2.5% 60.3%  7 2.5% 0x000000010d7222f0 
     6 2.1% 62.4%  6 2.1% 0x000000010d721a4c 
     6 2.1% 64.5%  6 2.1% 0x000000010d721b1f 
     6 2.1% 66.7%  6 2.1% 0x000000010d721e0c 
     5 1.8% 68.4%  5 1.8% 0x000000010d721fba 
    ...... 

Parece que los perftools no se convierten las direcciones de funcionar nombres.

¿Alguien sabe lo que me falta aquí? ¿Qué debo hacer para que el generador de perfiles genere el resultado correcto?

EDITAR: Más información: no es un problema de pprof o google-perftools, sino más bien algo como gcc o macosx, porque Instrument.app también muestra direcciones en lugar de números de línea. No estoy familiarizado con el funcionamiento de los símbolos de depuración en Mac OS X, así que preferiría pensar que me falta algo aquí, en lugar de ser un error en gcc o Mac OS X. Me pregunto si alguien puede dar pistas sobre cómo funciona la información de depuración. para Mac OS X.

+0

"Estoy probando el perfil de algunos programas en C++" Entonces, ¿por qué etiqueta esta pregunta como C? –

+0

Este problema no es específico de C++ sino también de C. –

+0

No estoy familiarizado con el desarrollo de OS X ni el googleperf, pero en He utilizado las librerías de creación de perfiles antes, y además del indicador -g para la depuración, tuvimos que agregue el indicador -p al compilador y al enlazador para obtener detalles sobre el perfil. – fduff

Respuesta

4

Creo que en esta plataforma los símbolos de depuración permanecen en los archivos .o, no se mueven al ejecutable. Para obtener símbolos en gdb o perfiladores, debe guardar los archivos .o. Esto puede significar que necesita compilar su aplicación en dos pasos (compilar y luego vincular) para conservar los archivos .o.

Consulte this question para obtener información adicional.

Al consultar el código fuente de Perl Perl, los nombres de los símbolos se obtienen mediante el uso de nm y c++filt, por lo que podría intentar ejecutarlos por sí solo y descubrir por qué no funcionan. Desde la fuente pprof parece que intenta varios argumentos diferentes de línea de comandos para cubrir varias versiones de nm. Este es un resumen de las formas

nm [-D] -n [-f] [--demangle] objeto-archivo 2>/dev/nul [| cpp + filt]

Las partes que pongo entre corchetes son aquellas que el script determina en tiempo de ejecución si son necesarias para su plataforma y versiones de nm y C++ filt. Pruebe todas las combinaciones de las anteriores y vea qué funciona. Luego mire lo que hace el script pprof, tal vez agregando algunos printfs a él.

Buena suerte.

+0

No ayuda. Intenté guardar archivos .o pero pprof aún imprime la dirección en lugar de los números de línea. –

+0

El problema no es pprof, trabajaría dentro de gdb para cargar estos símbolos, eso puede darle una idea de lo que está sucediendo. Tal vez los archivos .o están en un directorio diferente de lo esperado. – Miguel

+0

Tuve algún progreso en esto: si comienzo el programa usando 'CPUPROFILE = cpu.profile gdb./A.out', luego' start' y 'cont' dentro de' gdb', puedo obtener los símbolos correctamente. Así que supongo que podría ser el problema de google-perforools el que no cargue los símbolos si empiezo el programa normalmente, de modo que la dirección registrada dentro del 'cpu.profile' es incorrecta. Como 'gdb' es bastante lento y no es práctico ejecutarlo todo el tiempo, realmente necesito comenzar el programa normalmente sin' gdb'. Entonces, ¿tienes alguna idea de cómo puedo hacer que funcione? Gracias. –

6

Esto parece estar relacionado con el diseño del espacio de direcciones aleatorización (ASLR) introducido en OS X 10.5

me he presentado issue #562 en el seguimiento de incidencias gperftools. Puede desactivar ASLR pasando -Wl,-no_pie.

Además, si no está obligado a usar gperftools, Instruments (viene con Xcode), vale la pena intentarlo.

+0

Gracias, esto fue exactamente eso. -Wl, -no_pie hace que pprof funcione "de fábrica" ​​en Mac OS. – Ogre

Cuestiones relacionadas