Guia de rastreamento dinâmico Solaris

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.