Guía de seguimiento dinámico de Solaris

Argumentos de macro

El compilador D proporciona también un conjunto de variables macro correspondientes a cualquier operando de argumento adicional especificado como parte de la invocación del comando dtrace. A estos argumentos macro se accede mediante los nombres $0 incorporados para el nombre del archivo del programa D o el comando dtrace , $1 para el primer operando adicional, $2 para el segundo operando, y así, sucesivamente. Si utiliza la opción dtrace -s, $0 se amplía hasta el valor del nombre del archivo de entrada utilizado con esta opción. Para los programas D especificados en la línea de comandos, $0 se amplía hasta el valor de argv[0] utilizado para ejecutar dtrace.

Los argumentos macro pueden ampliarse a enteros, identificadores o cadenas, en función del formato del texto correspondiente. Al igual que ocurre con todas las variables macro, los argumentos macro pueden utilizarse en cualquier lugar en el que puedan utilizarse enteros, identificadores y símbolos de cadena en un programa D. Todos los ejemplos siguientes podrían componer expresiones D válidas si asumen los valores de argumento macro adecuados:

execname == $1    /* with a string macro argument */
x += $1           /* with an integer macro argument */
trace(x->$1)      /* with an identifier macro argument */

Los argumentos macro pueden utilizarse para crear archivos de intérprete de dtrace que actúen como auténticos comandos de Solaris y que utilicen la información especificada por un usuario, o por otra herramienta, para modificar su conducta. Por ejemplo, el siguiente archivo intérprete D realiza un seguimiento de las llamadas de sistema write(2) ejecutadas por un Id. de proceso determinado:

#!/usr/sbin/dtrace -s

syscall::write:entry
/pid == $1/
{
}

Si convierte este archivo en ejecutable puede especificar el valor de $1 utilizando un argumento de línea de comandos adicional para su archivo intérprete:


# chmod a+rx ./tracewrite
# ./tracewrite 12345

La invocación de comando resultante cuenta las llamadas de sistema write(2) ejecutadas por el proceso con ID 12345.

Si su programa D hace referencia a un argumento macro no proporcionado en la línea de comandos, se imprimirá el mensaje de error pertinente y no se realizará correctamente la compilación del programa:


# ./tracewrite
dtrace: failed to compile script ./tracewrite: line 4:
  macro argument $1 is not defined

Los programas D pueden hacer referencia a argumentos macro no especificados si se establece la opción defaultargs. Si se establece la opción defaultargs, los argumentos no especificados tendrán el valor 0. Consulte el Capítulo 16Opciones y optimizables, para obtener más información sobre las opciones de compilador D. El compilador de D devolverá también un mensaje de error si se especifican argumentos adicionales en la línea de comandos a los que no haga referencia su programa D.

Los valores de los argumentos macro deben tener formato de entero, identificador o cadena. Si el argumento no coincide con ninguno de estos formatos, el compilador D devolverá el mensaje de error pertinente. Al especificar argumentos macro de cadena en un archivo de intérprete DTrace, sitúe el argumento entre un par adicional de comillas simples para evitar que la shell interprete las dobles comillas y el contenido de la cadena:


# ./foo '"a string argument"'

Si desea que se interpreten sus argumentos de macro de D como símbolos de cadena, incluso si el formato es el de un entero o identificador, coloque dos signos de dólar delante de la variable macro o el nombre del argumento (por ejemplo, $$1) para forzar que el compilador de D interprete el valor del argumento como si fuera una cadena rodeada de comillas dobles. Todas las secuencias de escape de cadena D habituales (consulte la Tabla 2–5) se amplían en el interior de cualquier argumento macro de cadena, con independencia de si se hace referencia a ellos con el formato de la macro $arg o $$arg. Si está definida la opción defaultargs, los argumentos no especificados a los que se haga referencia con el formato $$arg tendrán el valor de una cadena vacía ("").