Guía de seguimiento dinámico de Solaris

Capítulo 17 Proveedor dtrace

El proveedor dtrace proporciona varios sondeos relacionados con la propia aplicación DTrace. Puede utilizar estos sondeos para inicializar el estado antes de que comience el seguimiento y procesarlo una vez éste haya finalizado, además de para administrar los errores de ejecución inesperados que se produzcan en otros sondeos.

Sondeo BEGIN

El sondeo BEGIN se activa antes que los otros sondeos. No se activará ningún otro sondeo hasta que se hayan completado todas las cláusulas BEGIN. Este sondeo puede utilizarse para inicializar cualquier estado necesario para los otros sondeos. El ejemplo siguiente muestra cómo utilizar el sondeo BEGIN para inicializar una matriz asociativa con el fin de efectuar una asignación entre los bits de protección de mmap(2) y una representación textual:

BEGIN
{
	prot[0] = "---";
	prot[1] = "r--";
	prot[2] = "-w-";
	prot[3] = "rw-";
	prot[4] = "--x";
	prot[5] = "r-x";
	prot[6] = "-wx";
	prot[7] = "rwx";
}

syscall::mmap:entry
{
	printf("mmap with prot = %s", prot[arg2 & 0x7]);
}

El sondeo BEGIN se activa en un contexto no especificado. En otras palabra, la salida de stack() o ustack() y el valor de las variables específicas del contexto (por ejemplo, execname) son todas arbitrarias. No se debe deducir ninguna información relevante a partir del uso o la interpretación de estos valores. No se define ningún argumento para el sondeo BEGIN.

Sondeo END

El sondeo END se activa después de todos los demás sondeos. Este sondeo no se activará hasta que se hayan completado las cláusulas del resto de los sondeos. Este sondeo puede utilizarse para procesar el estado que se ha recopilado o para dar formato a la salida. Por lo tanto, la acción printa() se utiliza a menudo en el sondeo END. Los sondeos BEGIN y END pueden utilizarse conjuntamente para calcular el tiempo total que ha llevado el seguimiento:

BEGIN
{
	start = timestamp;
}

/*
 * ... other tracing actions...
 */

END
{
	printf("total time: %d secs", (timestamp - start) / 1000000000);
}

Consulte Normalización de los datos y printa() para conocer otros usos habituales del sondeo END.

Al igual que con el sondeo BEGIN, no se define ningún argumento para el sondeo END. El contexto en el que el sondeo END se activa es arbitrario y no se debe depender de él.

Al realizar un seguimiento con la opción bufpolicy establecida en fill, se reserva el espacio adecuado para incluir todos los registros de los que se ha realizado un seguimiento en el sondeo END. Consulte Directiva fill y sondeos END para obtener más información.


Nota –

La acción exit() provoca que se detenga el seguimiento y que se active el sondeo END. Sin embargo, se produce un retraso entre la llamada de la acción exit() y la activación del sondeo END. Durante este retraso, no se activará ningún sondeo. Después de que el sondeo llame a la acción exit(), el sondeo END no se activa hasta que el consumidor de DTrace determine que se h llamado a exit() y se ha detenido el seguimiento. La tasa con la que se comprueba el estado de salida puede establecerse mediante la opción statusrate. Para más información, consulte el Capítulo 16Opciones y optimizables.


Sondeo ERROR

El sondeo ERROR se activa cuando se produce un error de tiempo de ejecución al ejecutar una cláusula para un sondeo de DTrace. Por ejemplo, si una cláusula intenta dejar de hacer referencia a un puntero NULL, se activará el sondeo ERROR, como se muestra en el siguiente ejemplo.


Ejemplo 17–1 error.d: errores de registro

BEGIN
{
	*(char *)NULL;
}

ERROR
{
	printf("Hit an error!");
}

Al ejecutar este programa, verá una salida como la siguiente:


# dtrace -s ./error.d
dtrace: script './error.d' matched 2 probes
CPU     ID                    FUNCTION:NAME
  2      3                           :ERROR Hit an error!
dtrace: error on enabled probe ID 1 (ID 1: dtrace:::BEGIN): invalid address
(0x0) in action #1 at DIF offset 12
dtrace: 1 error on CPU 2

La salida muestra que se ha activado el sondeo ERROR y cómo dtrace(1M) informa del error. dtrace cuenta con su propia activación del sondeo ERROR para permitirle informar de los errores. Si utiliza el sondeo ERROR, puede llevar a cabo su propia administración de errores personalizada.

Los argumentos del sondeo ERROR son los siguientes:

arg1

El identificador de sondeo habilitado (EPID) del sondeo que ha provocado el error.

arg2

El índice de la acción que ha provocado el fallo. 

arg3

El desplazamiento de DIF en esa acción o -1, si no es aplicable.

arg4

El tipo de fallo. 

arg5

El valor específico del tipo de fallo. 

La tabla siguiente describe los diversos tipos de fallos y el valor que arg5 presentará para cada uno:

Valor de arg4

Descripción 

Significado de arg5

DTRACEFLT_UNKNOWN

Tipo de fallo desconocido 

Ninguna 

DTRACEFLT_BADADDR

Acceso a una dirección no válida o no asignada 

Dirección a la que se ha accedido 

DTRACEFLT_BADALIGN

Acceso de memoria no alineada 

Dirección a la que se ha accedido 

DTRACEFLT_ILLOP

Operación no permitida o no válida 

Ninguna 

DTRACEFLT_DIVZERO

Entero dividido por cero 

Ninguna 

DTRACEFLT_NOSCRATCH

Espacio temporal insuficiente para satisfacer la asignación temporal 

Ninguna 

DTRACEFLT_KPRIV

Intento de acceder a una propiedad o una dirección del núcleo sin suficientes privilegios 

Dirección a la que se ha accedido o 0, si no es aplicable

DTRACEFLT_UPRIV

Intento de acceder a una propiedad o a una dirección de usuario sin suficientes privilegios 

Dirección a la que se ha accedido o 0, si no es aplicable

DTRACEFLT_TUPOFLOW

Desbordamiento de la pila de parámetros internos de DTrace 

Ninguna 

Si las acciones llevadas a cabo en el propio sondeo ERROR provocan un error, éste se omitirá de forma silenciosa; no se llamará recursivamente al sondeo ERROR.

Estabilidad

El proveedor dtrace utiliza el mecanismo de estabilidad de DTrace para describir sus características de estabilidad, como se muestra en la siguiente tabla: Para obtener más información sobre el mecanismo de estabilidad, consulte el Capítulo 39Estabilidad.

Elemento 

Estabilidad del nombre 

Estabilidad de los datos 

Clase de dependencia 

Proveedor 

Estable 

Estable 

Común

Módulo 

Privado 

Privado 

Desconocido 

Función 

Privado 

Privado 

Desconocido 

Nombre 

Estable 

Estable 

Común

Argumentos 

Estable 

Estable 

Común