Cada cláusula do programa em D começa com uma lista de uma ou mais descrições de teste, cada uma tem o formato usual:
provedor:módulo: função:nome
Se um ou mais campos da descrição de teste forem omitidos, os campos especificados serão interpretados da direita para a esquerda pelo compilador de D. Por exemplo, a descrição de teste foo:bar corresponderia a um teste com função foo e nome bar, independentemente do valor do provedor de teste e dos campos de módulo. Portanto, uma descrição de teste é realmente exibida de forma mais correta como um padrão que pode ser usado para corresponder a um ou mais testes com base em seus nomes.
Você deve escrever suas descrições de teste de D especificando todos os quatro delimitadores de campo que podem ser especificados, para que possa especificar o provedor desejado no lado esquerdo. Se você não especificar o provedor, talvez obtenha resultados inesperados, se vários provedores publicarem testes com o mesmo nome. Semelhantemente, as versões futuras do DTrace talvez incluam provedores cujos testes correspondam não intencionalmente às suas descrições de teste parcialmente especificadas. Você pode especificar um provedor mas coincidir qualquer um dos seus respectivos testes, deixando em branco qualquer um dos campos de módulo, função e nome. Por exemplo, a descrição syscall::: pode ser usada para coincidir cada teste publicado pelo provedor syscall do DTrace.
As descrições de teste também oferecem suporte a uma sintaxe de correspondência padrão semelhante à sintaxe de correspondência padrão globbing do shell descrita em sh(1). Antes de coincidir um teste com uma descrição, o DTrace examina cada campo de descrição dos caracteres *, ? e [. Se um desses caracteres aparecer em um campo de descrição de teste e não for precedido por um \, o campo será considerado como um padrão. O padrão de descrição deve corresponder a todo o campo correspondente de um determinado teste. A descrição de teste completa deve coincidir em cada campo para que corresponda e ative um teste com êxito. Um campo de descrição de teste que não seja um padrão deve coincidir com o campo de teste correspondente. Um campo de descrição vazio corresponde a qualquer teste.
Os caracteres especiais na tabela seguinte são reconhecidos em padrões de nome de teste:
Tabela 4–1 Caracteres correspondentes do padrão de nome de teste
Símbolo |
Descrição |
---|---|
* |
Corresponde a qualquer seqüência, incluindo a seqüência nula. |
? |
Corresponde a qualquer caractere único. |
[ ... ] |
Corresponde a qualquer um dos caracteres incluídos. Um par de caracteres separados por - corresponde a qualquer caractere dentro do par, inclusive. Se o primeiro caractere após [ for !, qualquer caractere não incluído no conjunto será correspondido. |
\ |
Interpreta o próximo caractere como ele mesmo, sem qualquer significado especial. |
Caracteres de correspondência de padrão podem ser usados em qualquer um dos quatro campos das suas descrições de teste. Você também pode usar padrões para listar testes correspondentes utilizando padrões na linha de comando com dtrace - l. Por exemplo, o comando dtrace -l -f kmem_* lista todos os testes do DTrace em funções cujos nomes começam com o prefixo kmem_.
Se você quiser especificar os mesmos predicados e ações para mais de uma descrição de teste ou padrão de descrição, coloque as descrições em uma lista separada por vírgulas. Por exemplo, o programa em D rastrearia um carimbo de data e hora toda vez que os testes associados a chamadas de entrada no sistema contendo as palavras “lwp” ou “sock” fossem acionadas:
syscall::*lwp*:entry, syscall::*sock*:entry { trace(timestamp); }
Uma descrição de teste também pode especificar um teste usando seu ID de teste de inteiro. Por exemplo, a cláusula:
12345 { trace(timestamp); }
poderia ser usada para ativar o ID de teste 12345, conforme relatado por dtrace -l -i 12345. Você deve sempre escrever seus programas em D usando descrições de teste legíveis. Não há garantias de que o ID de teste de inteiro permaneça consistente, conforme os módulos de kernel do provedor do DTrace são carregados e descarregados, ou após uma reinicialização.