O provedor do dtrace oferece vários testes relacionados ao próprio DTrace. Você pode usar esses testes para inicializar o estado antes que o rastreio comece, processar o estado depois que o rastreio foi concluído, e manipular os erros de execução inesperados em outros testes.
O teste BEGIN é acionado antes de qualquer outro teste. Nenhum outro teste será acionado até que todas as cláusulas de BEGIN tiverem sido concluídas. Este teste pode ser usado para inicializar qualquer estado que seja necessário em outros testes. O exemplo seguinte mostra como usar o teste BEGIN para inicializar uma matriz de associação para mapear entre os bits de proteção de mmap(2) e uma representação 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]); }
O teste BEGIN é acionado em um contexto inesperado. Isso significa que a saída de stack() ou ustack (), e o valor de variáveis específicas de contexto (por exemplo, execname), são todos arbitrários. Não se deve confiar nem interpretar esses valores para definir quaisquer informações significativas. Nenhum argumento é definido para o teste BEGIN.
O teste END é acionado depois de todos os outros testes. Este teste não será acionado até que todas as cláusulas de teste tenham sido concluídas. Este teste pode ser usado para processar o estado que foi coletado ou para formatar a saída. A ação printa () é, portanto, freqüentemente usada no teste END. Os testes BEGIN e END podem ser usados juntos para medir o tempo total gasto no rastreio:
BEGIN { start = timestamp; } /* * ... other tracing actions... */ END { printf("total time: %d secs", (timestamp - start) / 1000000000); }
Consulte Normalização de dados e printa() para obter outros usos do teste END.
Como acontece com o teste BEGIN, nenhum argumento é definido para o teste END. O contexto no qual o teste END é acionado é arbitrário e não deve depender dele.
Durante o rastreio com a opção bufpolicy definida como fill, o espaço adequado é reservado para acomodar quaisquer registros rastreados no teste END. Consulte Política fill e testes END para obter detalhes.
A ação exit() faz com que o rastreio pare e o teste END seja acionado. Entretanto, existe algum atraso entre a chamada da ação exit() e o acionamento do teste END . Durante esse atraso, nenhum teste será acionado. Depois que um teste chama a ação exit(), o teste END não é acionado até que o consumidor do DTrace determine que exit () tenha sido chamada e o rastreio pare. A taxa na qual o status de saída é verificado pode ser definida através da opção statusrate. Para obter mais informações, consulte o Capítulo 16Opções e ajustáveis.
O teste ERROR é acionado quando um erro de tempo de execução ocorre na execução de uma cláusula de um teste do DTrace. Por exemplo, se uma cláusula tentar cancelar a referência de um ponteiro NULL, o teste ERROR será acionado, como mostrado no exemplo seguinte.
BEGIN { *(char *)NULL; } ERROR { printf("Hit an error!"); }
Ao executar este programa, você verá uma saída parecida com o exemplo seguinte:
# 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 |
A saída mostra que o teste ERROR foi acionado, e também ilustra o dtrace(1M) informando o erro. dtrace possui sua própria ativação do teste ERROR para permitir que ele informe os erros. Usando o teste ERROR, você pode criar sua própria manipulação de erro personalizada.
Os argumentos para o teste ERROR são da seguinte forma:
arg1 |
O identificador de teste ativado (EPID) do teste que causou o erro |
arg2 |
O índice da ação que causou a falha |
arg3 |
O deslocamento DIF dessa ação ou -1, caso não seja aplicável |
arg4 |
O tipo de falha |
arg5 |
Valor particular para o tipo de falha |
A tabela abaixo descreve os vários tipos de falha e o valor que arg5 terá para cada um:
Valor de arg4 |
Descrição |
Significado de arg5 |
---|---|---|
DTRACEFLT_UNKNOWN |
Tipo de falha desconhecido |
Nenhum |
DTRACEFLT_BADADDR |
Acesso a endereço não mapeado ou inválido |
Endereço acessado |
DTRACEFLT_BADALIGN |
Acesso de memória não alinhada |
Endereço acessado |
DTRACEFLT_ILLOP |
Operação ilegal ou inválida |
Nenhum |
DTRACEFLT_DIVZERO |
Divisão de inteiro por zero |
Nenhum |
DTRACEFLT_NOSCRATCH |
Espaço temporário insuficiente para satisfazer a alocação temporária |
Nenhum |
DTRACEFLT_KPRIV |
Tentativa de acessar um endereço ou propriedade de kernel sem privilégios suficientes |
Endereço acessado ou 0, caso não seja aplicável |
DTRACEFLT_UPRIV |
Tentativa de acessar um endereço de usuário ou propriedade sem privilégios suficientes |
Endereço acessado ou 0, caso não seja aplicável |
DTRACEFLT_TUPOFLOW |
Estouro de fluxo de pilha de parâmetro interno do DTrace |
Nenhum |
Se as ações tomadas no próprio teste ERROR causarem um erro, esse erro será silenciosamente eliminado — o teste ERROR não será chamado recursivamente.
O provedor do dtrace usa o mecanismo de estabilidade do DTrace para descrever suas estabilidades, conforme mostrado na tabela seguinte. Para obter mais informações sobre o mecanismo de estabilidade, consulte o Capítulo 39Estabilidade.
Elemento |
Estabilidade de nome |
Estabilidade de dados |
Classe de dependência |
---|---|---|---|
Provedor |
Estável |
Estável |
Comum |
Módulo |
Privada |
Privada |
Desconhecida |
Função |
Privada |
Privada |
Desconhecida |
Nome |
Estável |
Estável |
Comum |
Argumentos |
Estável |
Estável |
Comum |