Guia de rastreamento dinâmico Solaris

Capítulo 36 Rastreio anônimo

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.

Ativações anônimas

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.

Declarando estado anônimo

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.

Exemplos de rastreio 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     
  ...