Guia de rastreamento dinâmico Solaris

Guia de introdução

O DTrace ajuda-o a compreender um sistema de software permitindo que modifique dinamicamente o kernel do sistema operacional e processos do usuário para registrar dados adicionais que você especificar em locais de interesse, chamados de testes. Um teste é um local ou atividade ao qual o DTrace pode vincular uma solicitação para realizar um conjunto de ações, como gravar um rastreamento de pilha, um carimbo de data/hora ou o argumento de uma função. Os testes são como sensores programáveis distribuídos em locais interessantes do sistema Solaris. Se você quiser saber o que está acontecendo, use o DTrace para programar os sensores apropriados para registrar as informações do seu interesse. Depois, quando cada teste for disparado, o DTrace obterá os dados resultantes e os informará para você. Se você não especificar as ações de um teste, o DTrace apenas anotará quando o teste for disparado.

Cada teste no DTrace possui dois nomes: um ID de inteiro exclusivo e um nome legível. Você irá começar a aprender o DTrace criando algumas solicitações muito simples usando o teste chamado BEGIN, que é acionado sempre que você inicia uma nova solicitação de rastreio. Você pode usar a opção -n do utilitário dtrace(1M) para habilitar um teste usando seu nome de seqüência de texto. Digite o seguinte comando:


# dtrace -n BEGIN

Depois de uma breve pausa, o DTrace irá informar que um teste foi ativado e você verá uma linha de resultado indicando que o teste BEGIN foi acionado. Quando esse resultado é exibido, o dtrace permanece em pausa aguardando que os outros testes sejam acionados. Como você não ativou outros testes e BEGIN só é acionado uma vez, pressione Control-C no shell para sair de dtrace e retornar ao prompt do shell:


# dtrace -n BEGIN
dtrace: description 'BEGIN' matched 1 probe
CPU     ID		      FUNCTION:NAME
  0      1                  :BEGIN
^C
#

O resultado informa que o teste chamado BEGIN foi disparado uma vez e seu nome e ID de inteiro, 1, são impressos. Observe que, por padrão, o nome de inteiro da CPU na qual esse teste foi disparado é exibido. Neste exemplo, a coluna CPU indica que o comando dtrace estava sendo executado na CPU 0 quando o teste foi acionado.

Você pode construir solicitações DTrace usando números arbitrários de testes e ações. Vamos criar uma solicitação simples usando dois testes adicionando o teste END ao comando do exemplo anterior. O teste END é acionado uma vez quando o rastreio é concluído. Digite o seguinte comando e depois pressione novamente Control-C no shell depois que a linha do resultado do teste BEGIN for exibida:


# dtrace -n BEGIN -n END
dtrace: description 'BEGIN' matched 1 probe
dtrace: description 'END' matched 1 probe
CPU     ID		      FUNCTION:NAME
  0      1                  :BEGIN
^C
  0      2                    :END
#

Como você pode ver, ao pressionar Control-C para sair de dtrace, você aciona o teste END. dtrace reporta o acionamento desse teste antes de sair.

Agora que você já sabe um pouco sobre nomeação e ativação de testes, está pronto para escrever a versão do DTrace do primeiro programa de todas as pessoas, "Olá, mundo". Além de construir experimentos do DTrace na linha de comando, você também pode escrevê-los em arquivos de texto usando a linguagem de programação D. Em um editor de texto, crie um novo arquivo chamado hello.d e digite seu primeiro programa em D:


Exemplo 1–1 hello.d: Ola, mundo da linguagem de programação D

BEGIN
{
	trace("hello, world");
	exit(0);
}

Depois de salvar o programa, você poderá executá-lo usando a opção -s do dtrace. Digite o seguinte comando:


# dtrace -s hello.d
dtrace: script 'hello.d' matched 1 probe
CPU     ID		      FUNCTION:NAME
  0	    1                  :BEGIN   hello, world
#

Como você pode ver, o dtrace imprimiu o mesmo resultado de antes seguido pelo texto “ola, mundo”. Ao contrário do exemplo anterior, você não precisou esperar e pressionar Control-C. Essas alterações foram o resultado das ações especificadas para o teste BEGIN em hello.d. Vamos explorar a estrutura do programa em D em mais detalhes para entender o que aconteceu.

Cada programa em D consiste em uma série de cláusulas, cada uma descrevendo um ou mais testes a serem ativados e um conjunto opcional de ações a serem realizadas quando o teste for acionado. As ações são listadas como uma série de instruções entre chaves { } após o nome do teste. Cada instrução é encerrada com ponto-e-vírgula (;). A primeira instrução usa a função trace() para indicar que o DTrace deve registrar o argumento especificado, a seqüência “ola, mundo ”, quando o teste BEGIN for acionado e depois imprimi-lo. A segunda instrução usa a função exit() para indicar que o DTrace deve encerrar o rastreio e sair do comando dtrace . O DTrace fornece um conjunto de funções úteis como trace() e exit() para que você chame seus programas em D. Para chamar uma função, especifique seu nome seguido por uma lista de argumentos entre parênteses. O conjunto completo das funções D é descrito no Capítulo 10Ações e sub-rotinas.

Se você já estiver familiarizado com a linguagem de programação C, provavelmente já percebeu pelo nome e pelos exemplos que a linguagem de programação D do DTrace é muito similar à C. Na verdade, a D é derivada de um grande subconjunto de C combinado com um conjunto especial de funções e variáveis para ajudar a facilitar o rastreamento. Você aprenderá mais sobre esses recursos nos próximos capítulos. Se você já tiver escrito um programa em C antes, poderá transferir imediatamente grande parte do seu conhecimento para construir programas de rastreio em D. Se você nunca tiver escrito um programa em C, aprender a linguagem D, mesmo assim, é muito fácil. Você aprenderá toda a sintaxe até o final do capítulo. Mas primeiro, vamos deixar as regras de linguagem um pouco de lado e descobrir mais sobre como o DTrace funciona e depois vamos voltar para aprender como construir programas em D mais interessantes.