DTrace: El PID provider

Como hemos visto en el post anterior sobre DTrace, existe una gran cantidad de información a la que podemos acceder mediante los distintos provider disponibles y otros que se están desarrollando e incorporando poco a poco. De todos los provider disponibles en DTrace uno de los más interesantes es el pid provider.El pid provider nos permite, mediante DTrace, analizar qué está haciendo un proceso que se está ejecutando en el sistema, pero no solo con la información que devuelven los distintos providers que tenemos disponible, sino que también permite analizar un proceso en el espacio de usuario, es decir, podemos ver cuando, se ejecutan funciones creadas especificamente para la ejecución del proceso, pertenecientes a librerias o código que es usado por el proceso.

Analizando un proceso en ejecución

Una forma sencilla de ver que está haciendo un proceso es mediante la siguiente línea de comando:

root@host # dtrace -q -n  'syscall:::/pid==14335/{printf("n %s",probefunc);}'
nanosleep
write
write
write
write
nanosleep
nanosleep
write
write
write
write
nanosleep^C
root@host #

De la salida vemos que el proceso con PID 14335 está ejecutando las llamadas a sistema write y nanosleep.Con esta sencilla línea de comando, podemos ver qué hace un proceso que está corriendo.

Utilizando el PID provider

Ademas de utilizar las distintas opciones de predicado disponibles en DTrace, podemos seleccionar un proceso mediante el pid provider. Pero antes, vamos a mostrar el código fuente de un sencillo ejemplo:

#include < stdio.h >

void funcionA()
{
        printf("nt funcionA()");
}

void funcionB()
{
        sleep(3);
}

main()
{
int c;
        c=1;
        while(c>0)
                {
                printf("n Contador: %d ",c);
                c++;
                funcionA();
                funcionB();
                }
}

El código es un sencillo bucle, el cual incrementa un contado, la varible c y llama a 2 funciones funcionA() y funcionB(). La salida de este programa es algo parecido a:

root@host # ./ejemplo
Contador: 1
         funcionA()
Contador: 2
         funcionA()
Contador: 3
         funcionA()
Contador: 4
          funcionA()
Contador: 5
         funcionA()
...

Ahora podemos utilizar le pid provider para analizar qué está haciendo el proceso que hemos lanzado.

root@host #
root@host # ps -ef | grep ejemplo
    root 14425 14246   0 20:00:34 pts/1       0:00 ./ejemplo
    root 14428 14400   0 20:01:55 pts/2       0:00 grep ejemplo
root@host #

Ahora que conocemos el PID del proceso, podemos construir la siguiente línea de comando:

root@host # dtrace -q -n  'pid14425:ejemplo::{printf("n %s",probefunc);}'
funcionB
funcionB
funcionB
funcionB
main
main
main
main
main
main
main
main
main
main
main
main
main
main
main
main
funcionA
funcionA
funcionA
funcionA
funcionA
funcionA
funcionA
funcionA
funcionA
funcionA
main
main
funcionB
funcionB
funcionB
funcionB
funcionB^C

El pid provider se construye con la cadena pid y el PID del proceso, como nombre del módulo utilizaremos el nombre del proceso, para nuestro caso ejemplo.Desde este momento, las posibilidades son infinitas, ya que podemos analizar cómo se está comportando una función que trabaja en el espacio de usuario.

root@host # dtrace -q -n  'pid14425:ejemplo::entry{printf("n %s",probefunc);}'
funcionA
funcionB
funcionA
funcionB

Conclusión

La utilización del pid provider nos abre una gran ventana en el uso de la instrumentación en el análisis de los procesos. DTrace nos permite adentrarnos cada vez más en la forma en la que nuestros procesos interactuan con el sistema y la utilización del pid provider es una herramienta fundamental para la instrumentación de procesos.