Guia de rastreamento dinâmico Solaris

Teste ERROR

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.


Exemplo 17–1 error.d: erros de registro

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.