Guía de seguimiento dinámico de Solaris

Capítulo 36 Seguimiento anónimo

En este capítulo, se describe el seguimiento anónimo, aquél que no está asociado a ningún consumidor de DTrace. El seguimiento anónimo se utiliza cuando no se puede ejecutar ningún proceso de consumidor de DTrace. El uso más común del seguimiento anónimo consiste en permitir a los programadores de controladores de dispositivos realizar un seguimiento de las actividades que tienen lugar durante el arranque del sistema y depurarlas. Cualquier seguimiento que pueda realizarse de forma interactiva, también puede realizarse de forma anónima. Sin embargo, sólo el superusuario puede crear una habilitación anónima, y sólo puede haber una habilitación anónima cada vez.

Habilitaciones anónimas

Para crear una habilitación anónima, utilice la opción -A junto con una llamada a dtrace(1M) que especifique los sondeos, los predicados, las acciones y las opciones que desee. dtrace agregará una serie de propiedades del controlador que representan la solicitud al archivo de configuración del controlador dtrace(7D), normalmente /kernel/drv/dtrace.conf. El controlador de dtrace(7D) leerá estas propiedades al cargarse. El controlador habilitará los sondeos especificados con las acciones especificadas y creará un estado anónimo para asociarlo a la nueva habilitación. Normalmente, el controlador de dtrace(7D) se carga a petición, al igual que cualquier controlador que actúe como proveedor de DTrace. Para permitir el seguimiento durante el arranque, el controlador de dtrace(7D) debe cargarse lo antes posible. dtrace agrega las instrucciones forceload necesarias a /etc/system (consulte system(4)) para cada proveedor de DTrace solicitado y para el propio dtrace(7D).

A continuación, cuando se arranque el sistema, dtrace(7D) emite un mensaje que indica que el archivo de configuración se ha procesado satisfactoriamente.

Pueden establecerse todas las opciones con la habilitación anónima, incluido el tamaño de la memoria intermedia, el tamaño de la variable dinámica, el número de especulaciones, etc.

Para eliminar una habilitación anónima, especifique -A en dtrace sin ninguna descripción de sondeo.

Reclamación del estado anónimo

Una vez que el equipo se ha arrancado por completo, puede reclamarse cualquier estado anónimo especificando la opción -a con dtrace. De forma predeterminada, -a reclama el estado anónimo, procesa los datos existentes y sigue ejecutándose. Para consumir el estado anónimo y, a continuación, salir, agregue la opción -e.

Una vez consumido el estado anónimo desde el núcleo, éste no puede sustituirse: se reutilizarán las memorias intermedias del núcleo que lo contenían. Si intenta reclamar un estado de seguimiento anónimo cuando no existe ninguno, dtrace generará un mensaje parecido al siguiente:


dtrace: could not enable tracing: No anonymous tracing state

Si se producen anulaciones o errores, dtrace generará los mensajes adecuados cuando se reclame el estado anónimo. Los mensajes de anulaciones o errores son iguales para los estados que son anónimos y los que no lo son.

Ejemplos de seguimiento anónimo

En el ejemplo siguiente se muestra una habilitación de DTrace anónima para cada sondeo del 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

Después del reinicio, dtrace(7D) imprime un mensaje en la consola para indicar que se están habilitando los sondeos 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.
  ...

Una vez reiniciado el equipo, el estado anónimo puede consumirse especificando la opción -a con 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 
  ...

El siguiente ejemplo se centra únicamente en aquellas funciones que se han llamado desde iprbattach(). En un editor, escriba la siguiente secuencia de comandos y guárdela en un archivo con el nombre iprb.d.

fbt::iprbattach:entry
{
	self->trace = 1;
}

fbt:::
/self->trace/
{}

fbt::iprbattach:return
{
	self->trace = 0;
}

Ejecute los comandos para borrar los valores anteriores del archivo de configuración del controlador, instale la nueva solicitud de seguimiento anónimo y reinicie:


# 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

Después de reiniciar, dtrace(7D) imprime un mensaje distinto en la consola para indicar la habilitación ligeramente 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.
  ...

Una vez que el equipo haya arrancado por completo, ejecute dtrace con las opciones -a y -e para consumir los datos anónimos, y, a continuación, salir.


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