O provedor pid permite rastrear a entrada e o retorno de uma função em um processo do usuário, assim como qualquer instrução conforme especificada por um endereço absoluto ou deslocamento de função. O provedor pid não tem efeito quando os testes não estão ativados. Quando os testes estão ativados, eles só induzem efeito de teste nos processos que são rastreados.
Quando o compilador coloca uma função inline, o teste do provedor pid não é acionado. Para evitar que uma função seja colocada inline no momento da compilação, consulte a documentação do seu compilador.
O provedor pid se comporta de forma imprevisível quando testa uma função que usa ponteiros de função para chamar uma subfunção. Você pode colocar testes explicitamente nos endereços da entrada e retorno da função para analisar tais funções.
O provedor pid realmente define uma classe de provedores. Cada processo pode ter potencialmente seu próprio provedor pid associado. Um processo com ID 123, por exemplo, seria rastreado através do provedor pid123. Para testes de um desses provedores, a porção do módulo da descrição do teste se refere a um objeto carregado no espaço de endereço do processo correspondente. O exemplo seguinte usa mdb(1) para exibir uma lista de objetos:
$ mdb -p 1234 Loading modules: [ ld.so.1 libc.so.1 ] > ::objects BASE LIMIT SIZE NAME 10000 34000 24000 /usr/bin/csh ff3c0000 ff3e8000 28000 /lib/ld.so.1 ff350000 ff37a000 2a000 /lib/libcurses.so.1 ff200000 ff2be000 be000 /lib/libc.so.1 ff3a0000 ff3a2000 2000 /lib/libdl.so.1 ff320000 ff324000 4000 /platform/sun4u/lib/libc_psr.so.1 |
Na descrição do teste, você nomeia o objeto pelo nome do arquivo, não por seu nome de caminho completo. Você também pode omitir o sufixo .1 ou so.1. Todos os exemplos seguintes nomeiam o mesmo teste:
pid123:libc.so.1:strcpy:entry pid123:libc.so:strcpy:entry pid123:libc:strcpy:entry
O primeiro exemplo é o nome real do teste. Os outros exemplos são alias convenientes que são substituídos internamente pelo nome de objeto de carga completo.
Para o objeto de carga do executável, use o alias a.out . As duas descrições de teste seguintes nomeiam o mesmo teste:
pid123:csh:main:return pid123:a.out:main:return
Como acontece com todos os testes ancorados do DTrace, o campo de função da descrição do teste nomeia uma função no campo do módulo. Um binário de aplicativo do usuário possui vários nomes para a mesma função. Por exemplo, mutex_lock pode ser um nome alternativo da função pthread_mutex_lock em libc.so.1 . O DTrace escolhe um nome canônico para tais funções e usa esse nome internamente. O exemplo seguinte mostra como o DTrace remapeia internamente os nomes de módulo e de função para um formato canônico:
# dtrace -q -n pid101267:libc:mutex_lock:entry'{ \ printf("%s:%s:%s:%s\n", probeprov, probemod, probefunc, probename); }' pid101267:libc.so.1:pthread_mutex_lock:entry ^C |
Esta renomeação automática significa que os nomes dos testes ativados por você podem ser ligeiramente diferentes daqueles realmente ativados. O nome canônico sempre será consistente entre as execuções do DTrace nos sistemas que executam a mesma versão do Solaris.
Consulte o Capítulo 33Rastreio de processo do usuário para obter exemplos de como usar o provedor pid eficientemente.
O provedor pid permite que você rastreie a entrada e o retorno de função nos programas do usuário, assim como o provedor FBT fornece esse recurso para o kernel. A maioria dos exemplos deste manual que usam o provedor FBT para rastrear as chamadas da função do kernel podem ser ligeiramente modificados para que se apliquem aos processos do usuário.
Um teste entry é acionado quando a função rastreada é chamada. Os argumentos dos testes "entry" são valores dos argumentos para a função rastreada.
Um teste return é acionado quando a função rastreada retorna ou faz uma chamada de cauda para outra função. O valor de arg0 é o deslocamento na função da instrução de return; arg1 mantém o valor de return.
O uso de argN retorna valores não filtrados e não processados como o tipo int64_t. O provedor pid não oferece suporte ao formato args[N ].
O provedor pid permite que você rastreie qualquer instrução em uma função. Por exemplo, para rastrear os 4 bytes da instrução em uma função main(), você poderia usar um comando semelhante ao exemplo seguinte:
pid123:a.out:main:4
Toda vez que o programa executa a instrução no endereço main+4, este teste será ativado. Os argumentos dos testes de deslocamento são indefinidos. A matriz uregs[] irá ajudá-lo a examinar o estado do processo nestes locais de teste. Consulte Matriz uregs[] para obter mais informações.
O provedor pid 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 |
Desenvolvendo |
Desenvolvendo |
ISA |
Módulo |
Privada |
Privada |
Desconhecida |
Função |
Privada |
Privada |
Desconhecida |
Nome |
Desenvolvendo |
Desenvolvendo |
ISA |
Argumentos |
Privada |
Privada |
Desconhecida |