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