Guía de seguimiento dinámico de Solaris

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.