Guia de rastreamento dinâmico Solaris

Capítulo 17 Provedor do dtrace

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.

Teste BEGIN

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.

Teste END

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.


Observação –

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.


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.

Estabilidade

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