Este capítulo descreve o rastreio anônimo: aquele que não é associado a nenhum consumidor do DTrace. O rastreio anônimo é usado quando não é possível executar processos de consumidor do DTrace. O uso mais comum do rastreio anônimo é permitir que desenvolvedores de driver de dispositivo depurem e rastreiem uma atividade que ocorra durante a inicialização do sistema. Qualquer rastreio que possa ser feito interativamente pode ser feito anonimamente. Entretanto, somente o superusuário pode criar uma ativação anônima, e somente uma ativação anônima pode existir a qualquer momento.
Para criar uma ativação anônima, use a opção -A com uma chamada dtrace(1M) que especifica os testes, predicados, ações e opções desejados. O dtrace adicionará várias propriedades de driver representando sua solicitação ao arquivo de configuração do driver dtrace(7D), geralmente /kernel/drv/dtrace.conf. Essas propriedades serão lidas pelo driver dtrace(7D) quando ele for carregado. O driver ativará as ações especificadas nos testes especificados e criará um estado anônimo para associar à nova ativação. Normalmente, o driver dtrace(7D) é carregado por demanda, assim como os drivers que atuam como provedores do DTrace. Para permitir o rastreio durante a inicialização, o driver dtrace(7D) deve ser carregado o mais breve possível. O dtrace adiciona as instruções forceload necessárias a /etc/system (consulte system(4)) de cada provedor solicitado do DTrace e do próprio dtrace(7D).
Em seguida, quando o sistema é inicializado, uma mensagem é emitida pelo dtrace(7D) para indicar que o arquivo de configuração foi processado com êxito.
Todas as opções devem ser definidas com uma ativação anônima, incluindo o tamanho do buffer, o tamanho de variável dinâmica, o tamanho de especulação, o número de especulações, etc.
Para remover uma ativação anônima, especifique -A para dtrace sem descrições de teste.
Quando o computador tiver sido totalmente inicializado, o estado anônimo deve ser declarado especificando-se a opção -a com dtrace. Por padrão, -a declara o estado anônimo, processa os dados existentes e continua sendo executada. Para consumir o estado anônimo e encerrar, adicione a opção -e.
Depois que o estado anônimo tiver sido consumido no kernel, ele não poderá ser substituído: os buffers no kernel que o continham são reutilizados. Se você tentar declarar um estado de rastreio anônimo onde não houver um, o dtrace irá gerar uma mensagem similar ao seguinte exemplo:
dtrace: could not enable tracing: No anonymous tracing state |
Se eliminações ou erros tiverem ocorrido, o dtrace irá gerar as mensagens apropriadas quando o estado anônimo for declarado. As mensagens de eliminações e erros são as mesmas do estado anônimo e do não-anônimo.
O exemplo a seguir mostra uma ativação anônima do DTrace em cada teste no módulo iprb(7D):
# dtrace -A -m iprb dtrace: saved anonymous enabling in /kernel/drv/dtrace.conf dtrace: added forceload directives to /etc/system dtrace: run update_drv(1M) or reboot to enable changes # reboot |
Após a reinicialização, o dtrace(7D) imprime uma mensagem no console para indicar que ele está ativando os testes especificados:
... Copyright 1983-2003 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. NOTICE: enabling probe 0 (:iprb::) NOTICE: enabling probe 1 (dtrace:::ERROR) configuring IPv4 interfaces: iprb0. ... |
Quando o computador for reinicializado, o estado anônimo deve ser consumido especificando-se a opção -a com dtrace:
# dtrace -a CPU ID FUNCTION:NAME 0 22954 _init:entry 0 22955 _init:return 0 22800 iprbprobe:entry 0 22934 iprb_get_dev_type:entry 0 22935 iprb_get_dev_type:return 0 22801 iprbprobe:return 0 22802 iprbattach:entry 0 22874 iprb_getprop:entry 0 22875 iprb_getprop:return 0 22934 iprb_get_dev_type:entry 0 22935 iprb_get_dev_type:return 0 22870 iprb_self_test:entry 0 22871 iprb_self_test:return 0 22958 iprb_hard_reset:entry 0 22959 iprb_hard_reset:return 0 22862 iprb_get_eeprom_size:entry 0 22826 iprb_shiftout:entry 0 22828 iprb_raiseclock:entry 0 22829 iprb_raiseclock:return ... |
O exemplo a seguir focaliza somente nas funções chamadas de iprbattach(). Em um editor, digite o seguinte script e salve-o em um arquivo chamado iprb.d.
fbt::iprbattach:entry { self->trace = 1; } fbt::: /self->trace/ {} fbt::iprbattach:return { self->trace = 0; }
Execute os seguintes comandos para cancelar as configurações anteriores do arquivo de configuração do driver, instale a nova solicitação de rastreio anônimo e reinicialize:
# dtrace -AFs iprb.d dtrace: cleaned up old anonymous enabling in /kernel/drv/dtrace.conf dtrace: cleaned up forceload directives in /etc/system dtrace: saved anonymous enabling in /kernel/drv/dtrace.conf dtrace: added forceload directives to /etc/system dtrace: run update_drv(1M) or reboot to enable changes # reboot |
Após a reinicialização, o dtrace(7D) imprime uma mensagem diferente no console para indicar a ativação ligeiramente diferente:
... Copyright 1983-2003 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. NOTICE: enabling probe 0 (fbt::iprbattach:entry) NOTICE: enabling probe 1 (fbt:::) NOTICE: enabling probe 2 (fbt::iprbattach:return) NOTICE: enabling probe 3 (dtrace:::ERROR) configuring IPv4 interfaces: iprb0. ... |
Após a completa reinicialização do computador, execute o dtrace com as opções -a e -e para consumir os dados anônimos e depois encerrar.
# dtrace -ae CPU FUNCTION 0 -> iprbattach 0 -> gld_mac_alloc 0 -> kmem_zalloc 0 -> kmem_cache_alloc 0 -> kmem_cache_alloc_debug 0 -> verify_and_copy_pattern 0 <- verify_and_copy_pattern 0 -> tsc_gethrtime 0 <- tsc_gethrtime 0 -> getpcstack 0 <- getpcstack 0 -> kmem_log_enter 0 <- kmem_log_enter 0 <- kmem_cache_alloc_debug 0 <- kmem_cache_alloc 0 <- kmem_zalloc 0 <- gld_mac_alloc 0 -> kmem_zalloc 0 -> kmem_alloc 0 -> vmem_alloc 0 -> highbit 0 <- highbit 0 -> lowbit 0 <- lowbit 0 -> vmem_xalloc 0 -> highbit 0 <- highbit 0 -> lowbit 0 <- lowbit 0 -> segkmem_alloc 0 -> segkmem_xalloc 0 -> vmem_alloc 0 -> highbit 0 <- highbit 0 -> lowbit 0 <- lowbit 0 -> vmem_seg_alloc 0 -> highbit 0 <- highbit 0 -> highbit 0 <- highbit 0 -> vmem_seg_create ... |