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.