[Linuxcantabria] problemas con sprof/gprof
Pechitos McTetis
pechitos.mctetis en gmail.com
Vie Mayo 25 09:44:57 CEST 2007
Hola a todos!!
Tengo un problema con la aplicacion gprof/sprof para obtener un perfil
de ejecucion de una aplicacion que usa multihilo (multithread) y
librerias dinamicas.
Versiones de SO y entorno:
Linux 2.6.9-42.ELsmp
gprof 2.17
sprof 2.3.4
En el caso del multihilo, observamos que unicamente se obtienen datos
de profile del hilo principal.
Para resolver esto, usamos la solucion expuesta en esta pagina,
http://sam.zoy.org/writings/programming/gprof.html
pero los resultados no eran validos.
En el caso de las shared libraries, escribimos un pequeño programa
para probar las posibles opciones. El programa de prueba solo hace una
llamada a una funcion contenida en una shared library. Lo que
intentamos es ver tanto las llamadas hechas a funciones que estan en
la libreria, como las llamadas que se hacen desde ella.
El codigo del programa principal y de la libreria estan al final de este mail.
La secuencia de commandos usada es la siguiente:
$gcc -fPIC -c -g -pg fun_din.c
$gcc -shared -fPIC -g -pg -o libfun_din.so fun_din.o
$gcc -g -pg -o ppal ppal.c -L/disk1/users/nor/jangel -lfun_din
$export LD_PROFILE=libfun_din.so
$export LD_PROFILE_OUTPUT=/disk1/users/nor/jangel
$ppal
Y los resultados obtenidos son estos:
$sprof libfun_din.so libfun_din.so.profile
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls us/call us/call name
0.00 0.00 0.00 1 0.00 func_lib_din
index % time self children called name
[0] 0.0 0.00 0.00 0 printf@@GLIBC_2.2.5 [0]
0.00 0.00 1/1 func_lib_din [1]
-----------------------------------------------
0.00 0.00 1/1 <UNKNOWN>
[1] 0.0 0.00 0.00 1 func_lib_din [1]
-----------------------------------------------
$gprof -b ppal gmon.out
Flat profile:
Each sample counts as 0.01 seconds.
no time accumulated
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 1 0.00 0.00 data_start
Call graph
granularity: each sample hit covers 2 byte(s) no time propagated
index % time self children called name
0.00 0.00 1/1 main [7]
[1] 0.0 0.00 0.00 1 data_start [1]
-----------------------------------------------
Index by function name
[1] data_start
$gprof -b ppal libfun_din.so.profile gmon.out
gprof: file `libfun_din.so.profile' has unsupported version 131071
Si compilamos y linkamos el programa principal SIN la opcion de
profile, este es el resultado (parece mucho mas adecuado):
$gcc -g -o ppal ppal.c -L/disk1/users/nor/jangel -lfun_din
$ppal
$sprof libfun_din.so libfun_din.so.profile
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls us/call us/call name
100.00 9.91 9.91 19910000.00 func_lib_din
index % time self children called name
[0] 0.0 0.00 0.00 0 printf@@GLIBC_2.2.5 [0]
9.91 0.00 1/1 func_lib_din [1]
-----------------------------------------------
0.00 0.00 1/1 <UNKNOWN>
[1] 100.0 9.91 0.00 1 func_lib_din [1]
-----------------------------------------------
El problema es que en este caso no tenemos el profile (fichero
gmon.out) del programa principal.
Tambien hemos probado a linkar estaticamente con las librerias
glibc-profile-2.3.4, sin resultado.
En resumen: como podemos obtener informacion correcta para trazar
tanto el programa principal como las llamadas a/de la libreria
dinamica?
Muchas gracias por vuestra ayuda.
Codigo fuente del programa de ejemplo:
------fun_din.h------
#include <stdio.h>
int func_lib_din (int valor);
------fun_din.c-----
#include "fun_din.h"
int func_lib_din (int valor)
{
int i,l;
double j;
for (i=0;i<4000000;i++)
{
for (l=0;l<1000;l++)
{
j=1345634565424.1*1243623565.4;
};
};
printf("Valor: %i\n", valor);
};
------ppal.c-------
#include "fun_din.h"
int main (void)
{
int entero;
entero = 10;
func_lib_din(entero);
return 0;
};
--
Linux Registred User #305598
Miembro del grupo lilo http://lilo.uah.es
Miembro del grupo linuca http://www.linuca.org
Clave pública GnuPG ID=1FC7B48B en el servidor: pgp.rediris.es
Más información sobre la lista de distribución Linuxcantabria