Cómo perfilar un programa C en Linux usando GNU gprof

Cómo perfilar un programa C en Linux usando GNU gprof

El rendimiento es uno de los mayores desafíos que enfrentan los programadores al desarrollar software. Esa es la razón por la cual la creación de perfiles de código es uno de los aspectos más importantes del desarrollo de software, ya que le permite identificar cuellos de botella, código muerto e incluso errores. Si es un programador que desarrolla aplicaciones de software para Linux, el perfilador de GNU «gprof» es la herramienta que debe buscar.

Descargar e instalar

Gprof viene preinstalado con la mayoría de las distribuciones de Linux, pero si ese no es el caso con su distribución de Linux, puede descargarlo e instalarlo a través de un administrador de paquetes de línea de comandos como apt-get o yum. Por ejemplo, ejecute el siguiente comando para descargar e instalar gprof en sistemas basados ​​en Debian:

sudo apt-get install binutils

Requisitos

Antes de usar gprof para generar datos de perfiles, asegúrese de que el ejecutable de su programa contenga información adicional requerida por el generador de perfiles para funcionar correctamente. Esto se puede lograr agregando el -pg opción de línea de comando mientras compila su código, asumiendo que está usando el gcc compilador. Si está utilizando comandos separados para compilar y vincular, agregue la opción de línea de comando a ambos comandos.

Usando gprof

Considere el siguiente programa en C como ejemplo:

#include <stdio.h>
 
void func2()
{
   int count = 0;
   for(count=0; count < 0XFFFFF; count++);
 
   return;
}
 
void func1(void)
{
   int count = 0;
   for(count=0; count < 0XFF; count++)
       func2();
 
   return;
}
 
int main(void)
{
    printf("\n Hello World! \n");
    func1();
    func2();
    return 0;
}

Como se describe en la sección anterior, compile el código con el -pg opción:

gcc -Wall -pg test.c -o test

Una vez compilado, ejecuta el programa:

Después de una ejecución exitosa, el programa generará un archivo llamado «gmon.out» que contiene la información de creación de perfiles, pero sin procesar, lo que significa que no puede abrir el archivo y leer la información directamente. Para generar un archivo legible por humanos, ejecute el siguiente comando:

gprof test gmon.out > prof_output

Este comando escribe toda la información de creación de perfiles en un formato legible por humanos en el archivo «prof_output». Tenga en cuenta que puede cambiar el nombre del archivo de salida según su conveniencia.

Perfil plano y gráfico de llamadas

Si abre el archivo que contiene los datos de perfil, verá que la información se divide en dos partes: perfil plano y gráfico de llamadas. Mientras que el primero contiene detalles como el número de llamadas a funciones, el tiempo total de ejecución empleado en una función y más, el último describe el árbol de llamadas del programa y proporciona detalles sobre las funciones principal y secundaria de una función en particular.

Por ejemplo, el siguiente es el perfil Flat en nuestro caso:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
100.00      0.94     0.94      256     3.67     3.67  func2
  0.00      0.94     0.00        1     0.00   936.33  func1

El siguiente es el gráfico de llamadas:

index % time    self  children    called     name
                0.00    0.00       1/256         main [2]
                0.94    0.00     255/256         func1 [3]
[1]    100.0    0.94    0.00     256         func2 [1]
-----------------------------------------------
 
[2]    100.0    0.00    0.94                 main [2]
                0.00    0.94       1/1           func1 [3]
                0.00    0.00       1/256         func2 [1]
-----------------------------------------------
                0.00    0.94       1/1           main [2]
[3]     99.6    0.00    0.94       1         func1 [3]
                0.94    0.00     255/256         func2 [1]
-----------------------------------------------

Tenga en cuenta que el explicación detallada de estos campos está presente en el archivo que contiene la información de creación de perfiles (prof_output en este caso) y se genera cada vez que se ejecuta el generador de perfiles. Para desactivar los detalles, utilice el -b opción de línea de comando con el gprof dominio.

Algunos puntos importantes

  • para escribir el gmon.out correctamente, su programa debe salir normalmente. El archivo no se produce cuando el programa sale llamando al _exit() funciona o termina anormalmente debido a una señal no manejada.
  • El archivo «gmon.out» siempre se crea en el directorio de trabajo actual. Por lo tanto, asegúrese de que su programa tenga suficientes privilegios para crear un archivo en el directorio actual.
  • Una herramienta externa con el nombre de gprof2dot se puede utilizar para convertir el gráfico de llamadas de gprof en forma gráfica.
  • Usando gprof, también puede producir una lista de fuentes anotadas que da una idea sobre la cantidad de veces que se ejecutó cada línea del programa. Para producir esta información, compile el programa con -g (junto con -pg opción explicada anteriormente) y ejecute el gprof comando con el -A opción de línea de comando.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Experto Geek - Tu Guía en Tendencias Tecnológicas