Guia de rastreamento dinâmico Solaris

Argumentos de macro

O compilador de D também fornece um conjunto de variáveis de macro correspondentes a quaisquer operandos de argumento adicionais especificados como parte da chamada do comando dtrace. Estes argumentos de macro são acessados através de nomes incorporados $0 do nome do arquivo do programa em D ou do comando dtrace , $1 do primeiro operando adicional, $2 do segundo operando, e assim por diante. Se você usar a opção -s do dtrace , $0 se expandirá para o valor do nome do arquivo de entrada usado com esta opção. Para programas em D especificados na linha de comando, $0 se expande para o valor de argv[0] usado para executar o próprio dtrace.

Os argumentos de macro podem se expandir para inteiros, identificadores ou seqüências, dependendo do formato do texto correspondente. Como acontece com todas as variáveis de macro, os argumentos de macro podem ser usados em qualquer lugar em que um inteiro, um identificador e os símbolos de seqüência possam ser usados em um programa em D. Todos os exemplos seguintes poderiam formar expressões de D válidas, presumindo-se que os valores de argumento de macro estejam apropriados:

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

Os argumentos de macro podem ser usados para criar arquivos de intérprete do dtrace que agem como comandos reais do Solaris e usam informações especificadas por um usuário ou por outra ferramenta para modificar seu comportamento. Por exemplo, o arquivo de intérprete de D rasteia as chamadas do sistema write(2) executadas por um ID de processo específico:

#!/usr/sbin/dtrace -s

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

Se você tornar este arquivo de intérprete executável, poderá especificar o valor de $1 usando argumentos de linha de comando adicionais em seu arquivo de intérprete:


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

A chamada de comando resultante conta cada chamada do sistema write(2) executada pelo ID de processo 12345.

Se o seu programa em D fizer referência a um argumento de macro que não seja fornecido na linha de comando, será impressa uma mensagem de erro apropriada e o seu programa não será compilado:


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

Os programas em D poderão fazer referência a argumentos de macro não especificados, se a opção defaultargs estiver definida. Se defaultargs estiver definida, os argumentos não especificados terão o valor 0. Consulte o Capítulo 16Opções e ajustáveis para obter mais informações sobre as opções do compilador de D. O compilador de D também produzirá uma mensagem de erro, se forem especificados argumentos adicionais na linha de comando que não tenham sido referenciados por seu programa em D.

Os valores de argumento de macro devem correspondem ao formato de um inteiro, identificador ou seqüência. Se o argumento não corresponder a nenhum desses formatos, o compilador de D informará uma mensagem de erro apropriada. Ao especificar argumentos de macro de seqüência para um arquivo de intérprete do DTrace, coloque o argumento entre um par de aspas simples extra a fim de evitar a interpretação das aspas duplas e do conteúdo da seqüência pelo seu shell:


# ./foo '"a string argument"'

Se você quiser que os seus argumentos de macro de D sejam interpretados como símbolos de seqüência mesmo que eles correspondam a um inteiro ou identificador, coloque um prefixo na variável de macro ou nome do argumento com dois sinais de dólar à esquerda (por exemplo, $$1) para forçar o compilador de D a interpretar o valor do argumento como se ele fosse uma seqüência entre aspas duplas. Todas as seqüências de escape de seqüência de D (consulte a Tabela 2–5) são expandidas dentro de quaisquer argumentos de macro de seqüência, independentemente de serem referenciadas através do formato $arg ou $$arg da macro. Se a opção defaultargs estiver definida, os argumentos não especificados que são referenciados com o formato $$arg possuem o valor da seqüência vazia ("").