Guía de seguimiento dinámico de Solaris

Procedimientos iniciales

DTrace le ayuda a conocer un sistema de software, ya que le permite instrumentar dinámicamente los procesos del núcleo y de los usuarios del sistema operativo para registrar los datos adicionales que especifique en las ubicaciones que le interesen (denominados sondeos). Un sondeo es una ubicación o actividad a la que DTrace puede enlazar una solicitud para realizar un conjunto de acciones como, por ejemplo, registrar un seguimiento de la pila, una marca de hora o el argumento de una función. Los sondeos son como sensores programables distribuidos en ubicaciones relevantes de todo el sistema Solaris. Si desea conocer lo que está pasando en el sistema, utilice DTrace para programar los sensores adecuados y registrar la información que le interese. A continuación, a medida que cada sondeo se activa, DTrace recopila los datos de los sondeos y le proporciona la información. Si no especifica ninguna acción para un sondeo, DTrace sólo recopilará información cada vez que éste se active.

Cada sondeo de DTrace tiene dos nombres: un Id. exclusivo compuesto por un entero y un nombre formado por una cadena que puede leer el usuario. En primer lugar, vamos a aprender el funcionamiento de DTrace mediante la creación de varias solicitudes muy sencillas con el sondeo denominado BEGIN, que se activa cada vez que inicia una nueva solicitud de seguimiento. Puede utilizar la opción -n de la utilidad dtrace(1M) para habilitar un sondeo por su nombre de cadena. Escriba el siguiente comando:


# dtrace -n BEGIN

Después de una breve pausa, comprobará cómo DTrace le indica que se ha habilitado un sondeo y verá una línea de salida que le indica que se ha activado el sondeo BEGIN. Una vez que vea esta salida, dtrace permanece en estado de pausa, en espera de que se activen otros sondeos. Como no se ha habilitado ninguno de los otros sondeos y BEGIN sólo se activa una vez, pulse Control-C en la shell para salir de dtrace y volver al indicador de la shell:


# dtrace -n BEGIN
dtrace: description 'BEGIN' matched 1 probe
CPU     ID		      FUNCTION:NAME
  0      1                  :BEGIN
^C
#

La salida le indica que se ha activado el sondeo con el nombre BEGIN y tanto su nombre como el Id., 1, se han imprimido. Tenga en cuenta que se muestra de forma predetermina el nombre en forma de entero de la CPU en la que se activa este sondeo. En este ejemplo, la columna de la CPU indica que el comando dtrace se estaba ejecutando en la CPU 0 cuando se activó el sondeo.

Puede crear solicitudes de DTrace mediante números arbitrarios de sondeos y acciones. Vamos a crear una solicitud sencilla con dos sondeos agregando el sondeo END al comando del ejemplo anterior. El sondeo END se activa una vez al completar el seguimiento. Escriba el siguiente comando y, a continuación, pulse Control-C en la shell cuando vea la línea de salida del sondeo BEGIN:


# dtrace -n BEGIN -n END
dtrace: description 'BEGIN' matched 1 probe
dtrace: description 'END' matched 1 probe
CPU     ID		      FUNCTION:NAME
  0      1                  :BEGIN
^C
  0      2                    :END
#

Como puede observar, al pulsar Control-C para salir de dtrace, se activa el sondeo END. dtrace informa de la activación de este sondeo antes de salir.

Ahora que ya tiene conocimientos básicos sobre cómo asignar un nombre a un sondeo y cómo activarlo, puede escribir la versión de DTrace del primer programa general, "Hola Mundo". Además de la creación de experimentos de DTrace en la línea de comandos, también puede escribirlos en archivos de texto utilizando el lenguaje de programación D. En el editor de texto, cree un nuevo archivo denominado hello.d y escriba su primer programa D:


Ejemplo 1–1 hello.d: "Hola, mundo" con el lenguaje de programación D

BEGIN
{
	trace("hello, world");
	exit(0);
}

Una vez guardado el programa, puede ejecutarlo con la opción -s de dtrace. Escriba el siguiente comando:


# dtrace -s hello.d
dtrace: script 'hello.d' matched 1 probe
CPU     ID		      FUNCTION:NAME
  0	    1                  :BEGIN   hello, world
#

Como puede ver, dtrace imprimió el mismo resultado que antes seguido del texto "Hola, mundo". A diferencia del ejemplo anterior, no ha tenido que esperar ni pulsar Control-C. Estos cambios son el resultado de las acciones especificadas en el sondeo BEGIN de hello.d. Examinemos la estructura del programa D con más detalle para conocer lo que ha ocurrido.

Cada programa D está formado por una serie de cláusulas; cada una de ellas describe uno o varios de los sondeos que se van a habilitar, y un conjunto de acciones opcionales que se van a realizar una vez activado el sondeo. Estas acciones aparecen enumeradas como una serie de instrucciones entre llaves { } a continuación del nombre del sondeo. Cada instrucción finaliza con un punto y coma (;). La primera instrucción utiliza la función trace() para indicar que DTrace debe registrar el argumento especificado, la cadena "Hola mundo", al archivarse el sondeo BEGIN y, a continuación, imprimirse. La segunda instrucción utiliza la función exit() para indicar que DTrace debería detener el seguimiento y salir del comando dtrace. DTrace proporciona un conjunto de funciones útiles como, por ejemplo, trace() y exit() a las que puede llamar en sus programas D. Para llamar a una función, debe especificar su nombre seguido de una lista de los argumentos entre paréntesis. El conjunto completo de funciones D se describe en el Capítulo 10Acciones y subrutinas.

Si está familiarizado con el lenguaje de programación C, es probable que ya se haya dado cuenta de que el nombre y los ejemplos del lenguaje de programación D son muy parecidos a los del lenguaje C. De hecho, el lenguaje D se deriva de un amplio subconjunto de C combinado con un conjunto especial de funciones y variables que le facilitan la realización del seguimiento. Obtendrá más información sobre estas funciones en los siguientes capítulos. Si ya ha escrito anteriormente un programa C, podrá utilizar inmediatamente la mayor parte de sus conocimientos en la creación de programas de seguimiento en D. Si, por el contrario, no ha escrito nunca ningún programa C, el aprendizaje del lenguaje D le resultará de todas formas muy sencillo. Conocerá toda la sintaxis al finalizar este capítulo. En primer lugar, dejemos a un lado por un momento las reglas del lenguaje y examinemos cómo funciona DTrace. Regresaremos más adelante al aprendizaje de cómo crear programas D más interesantes.