[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