c++ - gprof informa que no hay tiempo acumulado
macos unix (6)
¿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.
Estoy tratando de perfilar una aplicación C ++ con gprof en una máquina que ejecuta OSX 10.5.7. Compilo con g ++ de la manera habitual, pero usando -pg flags, ejecuto la aplicación y trato de ver el gráfico de llamadas con gprof.
Lamentablemente, 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 fuente se compilan de una manera similar:
g++ -pg -O2 -DNDEBUG -I./ -ansi -c -o ScenarioLoader.o ScenarioLoader.cpp
Luego ejecuto ''ar'' para agrupar todos los archivos de objetos en una biblioteca. Más tarde, enlace y ejecuto gprof como tal:
g++ -pg -lm -o vrpalone vrpalone.o ../src/atomicprof.a lastbuild.o
./vrpalone
gprof gmon.out | less
¿Algunas ideas?
¿Tu programa usa múltiples hilos? He experimentado este problema con los programas multiproceso en Linux, no estoy seguro de si OS X tendría los mismos problemas
Aquí hay una solution al problema de subprocesamiento múltiple que he utilizado con éxito en el pasado.
Pensé que podría compartir esta discusión de la lista de correo de Apple que 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!
Por cierto, ¿bifurcas () en tu código? Si es así, agregue esto en el proceso hijo justo después de la bifurcación ():
extern void _start (void), etext (void);
monstartup ((u_long) &_start, (u_long) &etext);
Eso hizo el truco para mí.
Si su programa termina de una manera no limpia, entonces los datos del perfil no se escribirán correctamente. ¿Cómo está saliendo su programa?
A pesar de todo, recomiendo usar Shark 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.
Tal vez 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 allí.