2009-06-23 16 views
23

Estoy tratando de perfilar una aplicación C++ con gprof en una máquina con OSX 10.5.7. Compilo con g ++ de la forma habitual, pero usando -pg flags, ejecuto la aplicación y trato de ver el gráfico de llamadas con gprof.gprof informa que no hay tiempo acumulado

Desafortunadamente, mi gráfico de llamadas contiene todos los ceros para todas las columnas de tiempo. Los valores en las columnas "llamadas" tienen valores razonables por lo que parece que se ha perfilado algo, pero estoy desconcertado por la falta de otros datos.

Todos mis archivos de código fuente se compilan de manera similar:

g++ -pg -O2 -DNDEBUG -I./ -ansi -c -o ScenarioLoader.o ScenarioLoader.cpp 

que ejecute 'AR' para agrupar todos los archivos de objetos en una biblioteca. Más tarde, me enlace y corro gprof como tan:

g++ -pg -lm -o vrpalone vrpalone.o ../src/atomicprof.a lastbuild.o 
./vrpalone 
gprof gmon.out | less 

¿Alguna idea?

+0

** gprof ** existe desde 1982. Desde entonces, el diseño de computadoras y lenguajes ha avanzado enormemente, pero nuestra comprensión colectiva de los problemas de rendimiento ha progresado muy poco.Todavía hablamos de manera flexible sobre los mismos conceptos que ** gprof ** introdujo, y no hemos intentado realmente entenderlos. [Aquí hay una discusión y presentación de algunas ideas más recientes.] (Https://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343) –

Respuesta

5

Pensé que podría compartir this Apple mailing list discussion con el que me encontré recientemente.

El comportamiento descrito aquí es exactamente lo que estoy experimentando. Parece que gprof se ha roto en OSX durante bastante tiempo.

He recurrido a Shark, que ha sido útilmente sugerido por Dave Rigby.

Gracias!

11

Si su programa termina de una manera no limpia, entonces los datos del perfil no se escribirán correctamente. ¿Cómo sale el programa?

De todos modos, recomiendo utilizar Shark en lugar de gprof, es muy fácil de usar y superior en casi todos los sentidos a gprof, y no requiere que recompile su programa.

+0

Hola Dave. Mi programa termina limpiamente He echado un vistazo a Shark y, aunque funciona, parece que no puedo hacer que genere un perfil plano. Hay una opción de aplanamiento que he encontrado pero no muestra la misma información que gprof que es decepcionante; idealmente quisiera que todas las funciones con el mismo nombre se agreguen juntas. Tampoco puedo hacer que Shark muestre el número de llamadas a cada función. – Daniel

+0

Encontré la opción de "vista pesada" para resolver el problema de aplanamiento. Todavía no se puede ver una buena manera de mostrar el número de llamadas. Oh bien. ¡Creo que tengo suficiente! Saludos por la ayuda Dave. – Daniel

+0

Fuerte +1 para tiburón. Beats gprof o Google Perf Tools al desarrollar en OSX. Puede ver el número exacto de muestras seleccionando una fila determinada. Luego muestra el número de muestras para esa función en la parte inferior. En raras ocasiones esto es útil, dado que el% es lo que es útil. – Tristan

2

¿Qué tan rápido se ejecuta su programa? Si es extremadamente rápido, puede ser demasiado rápido para crear un perfil real. Tuve este problema con un programa de procesamiento de texto muy simple: cuando lo ejecuté con mi archivo de prueba sub-1kb, noté todos los 0 en las columnas de tiempo. Lo resolví corriendo todo el texto de The Great Gatsby. Pruebe un conjunto de datos más grande o recorra su cálculo principal unos cientos de veces.

+0

Hola, psanf. Mi programa funciona por bastante tiempo dependiendo de la entrada que le doy (resuelve varios problemas de vendedores ambulantes). Intenté perfilarlo usando un pequeño problema que involucraba a 318 ciudades, que tarda ~ 30 segundos en resolverlo. – Daniel

2

¿Su programa usa varios subprocesos? He experimentado este problema con los programas multiproceso en Linux, no estoy seguro de si OS X tendría los mismos problemas

Aquí está un solution al problema de subprocesamiento múltiple que he utilizado con éxito en el pasado.

+0

Hola bklock. Mi programa solo está enhebrado por separado en este momento. Sin embargo, ¡tendré en cuenta ese vínculo! – Daniel

2

Quizás no sea relevante para la pregunta del OP, hay un escenario común donde "no se acumula el tiempo": si su código llama al kernel o llama bibliotecas no compiladas con -pg, no verá ningún tiempo acumulado por el tiempo pasado ahí.

2

Por cierto, ¿bifurcas() en tu código? Si es así, añadir esto en el proceso hijo justo después del tenedor():

extern void _start (void), etext (void); 
monstartup ((u_long) &_start, (u_long) &etext); 

Que hizo el truco para mí.

Cuestiones relacionadas