Guia de rastreamento dinâmico Solaris

Capítulo 30 Provedor pid

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.


Observação –

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.



Observação –

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.


Nomeando testes pid

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.

Testes de limite de função

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.

Testes entry

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.

Testes return

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.


Observação –

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 ].


Testes de deslocamento de função

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.

Estabilidade

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