Guía de seguimiento dinámico de Solaris

Capítulo 34 Seguimiento definido estáticamente para las aplicaciones de los usuarios

DTrace es una utilidad para desarrolladores de aplicaciones de usuario que permite definir sondeos personalizados en código de aplicación para aumentar las funciones del proveedor pid. Estos sondeos estáticos suponen poca carga o ninguna cuando se desactivan y, al igual que otros sondeos DTrace, se activan dinámicamente. Puede usar sondeos estáticos para describir la semántica de la aplicación a los usuarios de DTrace sin que se expongan o se requieran conocimientos de implementación de las aplicaciones. En este capítulo se describe la forma de definir sondeos estáticos en las aplicaciones de los usuarios y cómo se usa DTrace para activar dichos sondeos en los procesos de los usuarios.

Elección de los puntos de sondeo

DTrace permite a los desarrolladores incorporar puntos de sondeo estáticos en código de aplicación, tanto en aplicaciones completas como en bibliotecas compartidas. Estos sondeos se pueden activar cada vez que se ejecute una aplicación o una biblioteca, ya sea en un proceso de desarrollo o de producción. Debe definir sondeos que tengan un significado semántico que la comunidad de usuarios de DTrace pueda comprender fácilmente. Por ejemplo, puede definir sondeos query-receive y query-respond para un servidor Web. Estos sondeos equivalen a un cliente que envía una solicitud y el servidor Web que responde a la misma. La mayoría de los usuarios de DTrace comprenden fácilmente estos sondeos de ejemplo, que corresponden a las abstracciones de nivel superior para la aplicación, al contrario de lo que ocurre con los detalles de implementación de nivel inferior. Los usuarios de DTrace pueden usar estos sondeos para entender la distribución temporal de las solicitudes. Si el sondeo query-receive incluía las cadenas de solicitud URL como argumento, un usuario de DTrace podría determinar qué solicitudes generaron la mayor cantidad de E/S en un disco combinando este sondeo con el proveedor io.

También hay que tener en cuenta la estabilidad de las abstracciones descritas al elegir los nombres y las ubicaciones de los sondeos. ¿Se mantendrá este sondeo en las versiones futuras de la aplicación, incluso si cambia la implementación? ¿Tendrá sentido el sondeo en todas las arquitecturas de sistema o es sólo específico para un conjunto de instrucciones concreto? En este capítulo encontrará información sobre cómo estas decisiones determinarán sus definiciones de seguimiento estático.

Adición de sondeos a una aplicación

Los sondeos de DTrace para bibliotecas y ejecutables están definidos en una sección ELF del binario de aplicación correspondiente. En esta sección se indica cómo se definen los sondeos, cómo se agregan al código fuente de la aplicación y cómo se aumenta el proceso de construcción de una aplicación para incluir definiciones de sondeos de DTrace.

Definición de proveedores y sondeos

Los sondeos de DTrace se definen en un archivo de origen .d que se utiliza a continuación para compilar y vincular la aplicación. En primer lugar, seleccione un nombre adecuado para el proveedor de aplicaciones de usuario. El nombre del proveedor que elija se anexará al identificador de proceso de cada proceso que ejecute el código de la aplicación. Por ejemplo, si elige como nombre de proveedor myserv para un servidor Web que se estaba ejecutando con el ID de proceso 1203, el nombre del proveedor de DTrace correspondiente a este proceso será myserv1203. En el archivo de origen .d, agregue una definición de proveedor similar al siguiente ejemplo:

provider myserv {
	...
};			

A continuación, agregue una definición para cada sondeo y los argumentos correspondientes. El ejemplo siguiente define los dos sondeos que se han explicado en Elección de los puntos de sondeo. El primero de ellos tiene dos argumentos, ambos del tipo string, y el segundo sondeo no tiene argumentos. El compilador D convierte dos caracteres de subrayado consecutivos (__) de cualquier nombre de sondeo en un guión (-).

provider myserv {
	probe query__receive(string, string);
	probe query__respond();
};

Debe agregar atributos de estabilidad a la definición del proveedor para que los consumidores de los sondeos sepan que se pueden producir cambios en versiones futuras de la aplicación. Consulte el Capítulo 39Estabilidad para obtener más información acerca de los atributos de estabilidad de DTrace. Los atributos de estabilidad de definen en la forma que se indica en este ejemplo:


Ejemplo 34–1 myserv.d: Sondeos de aplicación definidos estáticamente

#pragma D attributes Evolving/Evolving/Common provider myserv provider
#pragma D attributes Private/Private/Unknown provider myserv module
#pragma D attributes Private/Private/Unknown provider myserv function
#pragma D attributes Evolving/Evolving/Common provider myserv name
#pragma D attributes Evolving/Evolving/Common provider myserv args

provider myserv {
	probe query__receive(string, string);
	probe query__respond();
};


Nota –

Las cadenas de D que utilicen argumentos no enteros de sondeos agregados por el usuario deben aplicar las funciones copyin() y copyinstr() para recuperar esos argumentos. Consulte el Capítulo 33Seguimiento de procesos de usuario para obtener más información.


Adición de sondeos al código de aplicación

Ahora que ha definido los sondeos en un archivo .d, debe aumentar el código fuente para indicar las ubicaciones que deben activar los sondeos. Considere el siguiente ejemplo de código fuente de aplicación en C:

void
main_look(void)
{
	...
	query = wait_for_new_query();
	process_query(query)
	...
}

Para agregar un sitio de sondeo, agregue una referencia a la macro DTRACE_PROBE() definida en <sys/sdt.h>, tal y como se muestra en el siguiente ejemplo:

#include <sys/sdt.h>
...

void
main_look(void)
{
	...
	query = wait_for_new_query();
	DTRACE_PROBE2(myserv, query__receive, query->clientname, query->msg);
	process_query(query)
	...
}

El sufijo 2 en el nombre de la macro DTRACE_PROBE2 hace referencia al número de argumentos que se pasan al sondeo. Los dos primeros argumentos de la macro del sondeo son el nombre del proveedor y el nombre del sondeo y deben corresponderse con las definiciones de sondeo y de proveedor D. Los argumentos de macro restantes son los asignados a las variables de DTrace arg0..9 al activarse los sondeos. El código fuente de la aplicación puede contener varias referencia al mismo nombre de sondeo y proveedor. Si el código fuente dispone de varias referencias al mismo sondeo, cualquiera de las referencias de la macro hará que el sondeo se active.

Creación de aplicaciones con sondeos

Debe aumentar el proceso de construcción de la aplicación para incluir las definiciones de sondeo y del proveedor DTrace. Un proceso de construcción habitual utiliza todos los archivos fuente y los compila para crear un archivo objeto correspondiente. Los archivos objeto compilados se vinculan posteriormente entre sí para crear el binario de aplicación acabado, tal y como se muestra en el siguiente ejemplo:


cc -c src1.c
cc -c src2.c
...
cc -o myserv src1.o src2.o ...

Para incluir las definiciones de sondeo de DTrace en la aplicación, agregue las reglas pertinentes de Makefile al proceso de construcción para ejecutar el comando dtrace como se muestra en el siguiente ejemplo:


cc -c src1.c
cc -c src2.c
...
dtrace -G -32 -s myserv.d src1.o src2.o ...
cc -o myserv myserv.o src1.o src2.o ...

El comando dtrace mostrado arriba permite procesar posteriormente los archivos objeto generados por los comandos del compilador precedente y genera el archivo objeto myserv.o a partir de myserv.d y otros archivos objeto. La opción dtrace -G se usa para vincular las definiciones de proveedor y sondeo a una aplicación de usuario. La opción -32 se usa para crear binarios de aplicación de 32 bits. La opción -64 se usa para crear binarios de aplicación de 64 bits.