Una vez determine cuál es el consumidor de su interés, es posible recuperar los datos correspondientes a cualquier memoria intermedia mediante la especificación de la estructura de datos en el dcmd ::dtrace. El siguiente ejemplo muestra la salida del dcmd ::dtrace en una activación anónima de syscall:::entry con la acción trace(execname):
> ::dtrace_state ADDR MINOR PROC NAME FILE cbfb7a40 2 - <anonymous> - > cbfb7a40::dtrace CPU ID FUNCTION:NAME 0 344 resolvepath:entry init 0 16 close:entry init 0 202 xstat:entry init 0 202 xstat:entry init 0 14 open:entry init 0 206 fxstat:entry init 0 186 mmap:entry init 0 186 mmap:entry init 0 186 mmap:entry init 0 190 munmap:entry init 0 344 resolvepath:entry init 0 216 memcntl:entry init 0 16 close:entry init 0 202 xstat:entry init 0 14 open:entry init 0 206 fxstat:entry init 0 186 mmap:entry init 0 186 mmap:entry init 0 186 mmap:entry init 0 190 munmap:entry init ... |
::dtrace dcmd maneja los errores de la misma forma que dtrace(1M): si se encuentran anulaciones, errores, anulaciones especulativas, etc., durante la ejecución del consumidor, ::dtrace emitirá un mensaje correspondiente al mensaje dtrace(1M).
El orden de los eventos tal y como lo muestra ::dtrace es siempre de más antiguo a más reciente dentro de una CPU determinada. Las memorias intermedias de la CPU se muestran en sí mismas en orden numérico. Si se requiere la ordenación de eventos de diferentes CPU, realice un seguimiento de la variable timestamp.
Puede visualizar sólo los datos de una CPU determinada especificando la opción - c a ::dtrace:
> cbfb7a40::dtrace -c 1 CPU ID FUNCTION:NAME 1 14 open:entry init 1 206 fxstat:entry init 1 186 mmap:entry init 1 344 resolvepath:entry init 1 16 close:entry init 1 202 xstat:entry init 1 202 xstat:entry init 1 14 open:entry init 1 206 fxstat:entry init 1 186 mmap:entry init ... |
Tenga en cuenta que ::dtrace sólo procesa datos de DTrace del núcleo. Los datos que se hayan consumido desde el núcleo y se hayan procesado (mediante dtrace(1M) u otras vías) no estarán disponibles para su procesamiento con ::dtrace. Para garantizar que la máxima cantidad de datos posible esté disponible en el momento del error, utilice una directiva de memoria intermedia de "introducción en memoria en anillo" (ring buffering). Consulte el Capítulo 11Memorias intermedias y almacenamiento en memoria intermedia para obtener más información sobre las políticas de búfer.
Los siguientes ejemplos crean una memoria intermedia en anillo de tamaño muy reducido (16K) y registran todas las llamadas de sistema y los procesos que las realizan:
# dtrace -P syscall'{trace(curpsinfo->pr_psargs)}' -b 16k -x bufpolicy=ring dtrace: description 'syscall:::entry' matched 214 probes |
La observación de un volcado de bloqueo realizado mientras el comando anterior se encontraba en ejecución devolverá una salida similar a la del siguiente ejemplo:
> ::dtrace_state ADDR MINOR PROC NAME FILE cdccd400 3 d15e80a0 dtrace ced065f0 > cdccd400::dtrace CPU ID FUNCTION:NAME 0 139 getmsg:return mibiisa -r -p 25216 0 138 getmsg:entry mibiisa -r -p 25216 0 139 getmsg:return mibiisa -r -p 25216 0 138 getmsg:entry mibiisa -r -p 25216 0 139 getmsg:return mibiisa -r -p 25216 0 138 getmsg:entry mibiisa -r -p 25216 0 139 getmsg:return mibiisa -r -p 25216 0 138 getmsg:entry mibiisa -r -p 25216 0 139 getmsg:return mibiisa -r -p 25216 0 138 getmsg:entry mibiisa -r -p 25216 0 17 close:return mibiisa -r -p 25216 ... 0 96 ioctl:entry mibiisa -r -p 25216 0 97 ioctl:return mibiisa -r -p 25216 0 96 ioctl:entry mibiisa -r -p 25216 0 97 ioctl:return mibiisa -r -p 25216 0 96 ioctl:entry mibiisa -r -p 25216 0 97 ioctl:return mibiisa -r -p 25216 0 96 ioctl:entry mibiisa -r -p 25216 0 97 ioctl:return mibiisa -r -p 25216 0 16 close:entry mibiisa -r -p 25216 0 17 close:return mibiisa -r -p 25216 0 124 lwp_park:entry mibiisa -r -p 25216 1 68 access:entry mdb -kw 1 69 access:return mdb -kw 1 202 xstat:entry mdb -kw 1 203 xstat:return mdb -kw 1 14 open:entry mdb -kw 1 15 open:return mdb -kw 1 206 fxstat:entry mdb -kw 1 207 fxstat:return mdb -kw 1 186 mmap:entry mdb -kw ... 1 13 write:return mdb -kw 1 10 read:entry mdb -kw 1 11 read:return mdb -kw 1 12 write:entry mdb -kw 1 13 write:return mdb -kw 1 96 ioctl:entry mdb -kw 1 97 ioctl:return mdb -kw 1 364 pread64:entry mdb -kw 1 365 pread64:return mdb -kw 1 366 pwrite64:entry mdb -kw 1 367 pwrite64:return mdb -kw 1 364 pread64:entry mdb -kw 1 365 pread64:return mdb -kw 1 38 brk:entry mdb -kw 1 39 brk:return mdb -kw > |
Tenga en cuenta que los registros más recientes de la CPU incluyen una serie de llamadas de sistema write(2) realizadas por un proceso mdb -kw. Probablemente, este resultado estará relacionado con el fallo del sistema, ya que un usuario puede ejecutar los datos o el texto del núcleo en ejecución con mdb(1) cuando se ejecuta con las opciones -k y - w. En este caso, los datos de DTrace proporcionan al menos una vía interesante de navegación, si no la causa raíz del fallo.