Guia de rastreamento dinâmico Solaris

Provedores e testes

Nos exemplos anteriores, você aprendeu a usar dois testes simples chamados BEGIN e END. Mas de onde vêm esses testes? Os testes do DTrace vêm de um conjunto de módulos do kernel chamados provedores. Cada um deles realiza um tipo particular de instrumentação para criar testes. Quando você usa o DTrace, cada provedor recebe uma oportunidade de publicar os testes que ele pode fornecer na estrutura do DTrace. Você depois pode ativar e vincular suas ações de rastreio a um dos testes que foram publicados. Para listar todos os testes disponíveis no seu sistema, digite o comando:


# dtrace -l
  ID   PROVIDER            MODULE          FUNCTION NAME
   1     dtrace                                     BEGIN
   2     dtrace                                     END
   3     dtrace                                     ERROR
   4   lockstat           genunix       mutex_enter adaptive-acquire
   5   lockstat           genunix       mutex_enter adaptive-block
   6   lockstat           genunix       mutex_enter adaptive-spin
   7   lockstat           genunix       mutex_exit  adaptive-release

   ... many lines of output omitted ...

#

Pode demorar algum tempo para que todo o resultado seja exibido. Para contar todos os testes, você pode digitar o comando:


# dtrace -l | wc -l
        30122

Você pode observar um total diferente na sua máquina, pois o número de testes varia dependendo da sua plataforma operacional e do software que você instalou. Como você pode ver, há muitos testes disponíveis , assim, você pode vasculhar todos os cantos escuros do sistema. Na verdade, até mesmo esse resultado não é a lista completa porque, como você verá posteriormente, alguns provedores oferecem a capacidade de criar novos testes dinâmicos com base nas suas solicitações de rastreio, tornado o número real de testes do DTrace virtualmente ilimitados.

Agora, observe o resultado de dtrace -l na janela do seu terminal. Observe que cada teste possui os dois nomes mencionados anteriormente, um ID de inteiro e um nome legível. O nome legível é composto de quatro partes, mostradas como colunas separadas no resultado de dtrace . As quatro partes do nome de um teste são:

Provedor 

O nome do provedor do DTrace que está publicando este teste. O nome do provedor geralmente corresponde ao nome do módulo do kernel do DTrace que realiza a instrumentação para ativar o teste. 

Módulo 

Se este teste corresponder a um local de programa específico, o nome do módulo no qual o teste está localizado. Este nome é o nome de um módulo do kernel ou o nome de uma biblioteca do usuário. 

Função 

Se este teste corresponder a um local de programa específico, o nome da função do programa na qual o teste está localizado. 

Nome 

O componente final do nome do teste é um nome que dá alguma idéia do significado semântico do teste, como BEGIN ou END.

Ao escrever o nome legível completo de um teste, escreva as quatro partes do nome separadas por dois-pontos, como por exemplo:

provedor:módulo: função:nome

Observe que alguns dos testes na lista não possuem um módulo e uma função, como os testes BEGIN e END usados anteriormente. Esses dois campos permanecem em branco em alguns testes porque esses testes não correspondem a um local ou a uma função de programa instrumentada específica. Em vez disso, esses testes fazem referência a um conceito mais abstrato como a idéia do final da solicitação de rastreio. Um teste que possui um módulo e uma função como parte de seu nome é conhecido como teste ancorado e um que não possui é conhecido como não ancorado.

Por convenção, se você não especificar todos os campos do nome de um teste, o DTrace corresponderá sua solicitação com todos os testes que possuam valores correspondentes nas partes do nome que você especificar. Em outras palavras, quando você usou o nome do teste BEGIN anteriormente, na verdade estava dizendo ao DTrace para corresponder qualquer teste cujo campo nome fosse BEGIN, independentemente do valor dos campos provedor, módulo e função. Quando isso acontece, há apenas um teste que corresponde a essa descrição, sendo assim, o resultado é o mesmo. Mas agora você sabe que o nome verdadeiro do teste BEGIN é dtrace:::BEGIN, o que indica que esse teste é fornecido pela própria estrutura do DTrace e não está ancorado a qualquer função. Assim, o programa >hello.d poderia ter sido escrito da maneira a seguir e produziria o mesmo resultado:

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

Agora que você entende a origem dos testes e como eles são nomeados, irá aprender um pouco mais sobre o que acontece quando você ativa testes e solicita que o DTrace faça alguma coisa, e depois retornaremos ao rápido tour da linguagem D.