El proveedor pid permite el seguimiento de la entrada y la vuelta de cualquier función en un proceso de usuario, así como cualquier instrucción tal y como la especifica una dirección absoluta o un desplazamiento de función. Si los sondeos no se encuentran habilitados, el proveedor pid no tendrá efectos de sondeo. Cuando los sondeos estén habilitados estos sólo tendrán efecto de sondeo en los procesos de los que se realiza seguimiento.
Cuando el compilador coloca una función en línea, no se activa el sondeo del proveedor pid. Para evitar colocar en línea una función durante la compilación, consulte la documentación del compilador.
El proveedor pid tiene un comportamiento inesperado cuando sondea una función que utiliza punteros de función para llamar a una subfunción. Puede colocar de forma explícita sondeos en las direcciones de la entrada de la función y volver para analizar dichas funciones.
En realidad, el proveedor pid define una clase de proveedores. Potencialmente, cada proceso puede tener su propio proveedor pid. El seguimiento de un proceso con, por ejemplo, Id. 123, se realizará mediante el proveedor pid123. Para los sondeos de uno de estos proveedores, la porción de módulo de la descripción del sondeo hace referencia a un objeto cargado en el espacio de direcciones del proceso correspondiente. El siguiente ejemplo utiliza mdb(1) para visualizar una lista de objetos:
$ mdb -p 1234 Loading modules: [ ld.so.1 libc.so.1 ] > ::objects BASE LIMIT SIZE NAME 10000 34000 24000 /usr/bin/csh ff3c0000 ff3e8000 28000 /lib/ld.so.1 ff350000 ff37a000 2a000 /lib/libcurses.so.1 ff200000 ff2be000 be000 /lib/libc.so.1 ff3a0000 ff3a2000 2000 /lib/libdl.so.1 ff320000 ff324000 4000 /platform/sun4u/lib/libc_psr.so.1 |
En la descripción del sondeo, se asigna el nombre al objeto según el nombre del archivo, y no según el nombre de ruta completo. También es posible omitir el sufijo .1 o so.1 . Los ejemplos siguientes asignan nombre al mismo sondeo:
pid123:libc.so.1:strcpy:entry pid123:libc.so:strcpy:entry pid123:libc:strcpy:entry
El primer ejemplo es el nombre real del sondeo. El resto de ejemplos son alias cómodos que se sustituyen internamente por el nombre completo de objeto de carga.
Para el objeto de carga del ejecutable puede utilizar el alias a.out . Las dos descripciones de sondeo siguientes dan nombre al mismo sondeo:
pid123:csh:main:return pid123:a.out:main:return
Al igual que ocurre con todos los sondeos DTrace anclados, el campo de función de la descripción del sondeo asigna nombre a una función del campo módulo. Puede que un binario de aplicación de usuario cuente con varios nombres para la misma función. Por ejemplo, mutex_lock podría ser un nombre alternativo para la función pthread_mutex_lock en libc.so.1 . DTrace elige para este tipo de funciones un nombre canónico y lo utiliza de forma interna. El siguiente ejemplo muestra la forma en la que DTrace reasigna de forma interna los nombres tanto de módulo como de función a un formato canónico:
# dtrace -q -n pid101267:libc:mutex_lock:entry'{ \ printf("%s:%s:%s:%s\n", probeprov, probemod, probefunc, probename); }' pid101267:libc.so.1:pthread_mutex_lock:entry ^C |
Este cambio de nombre automático implica que los nombres de los sondeos que habilite podrían ser ligeramente distintos a los que en realidad habilitó. El nombre canónico será siempre consistente entre ejecuciones de DTrace en sistemas que ejecuten la misma versión de Solaris.
Consulte el Capítulo 33Seguimiento de procesos de usuario para obtener ejemplos de cómo utilizar el proveedor pid de forma eficaz.
El proveedor pid le permite realizar un seguimiento de entrada y devolución de funciones en programas de usuario, del mismo modo que el proveedor FBT proporciona esta función al núcleo. La mayoría de los ejemplos contenidos en este manual que utilizan el proveedor FBT para realizar un seguimiento de las llamadas de función del núcleo pueden modificarse ligeramente para aplicarlos a procesos de usuario.
Los sondeos entry se activan al realizar la llamada de la función de la que se está efectuando el seguimiento. Los argumentos de sondeos de entrada son los valores de los argumentos de la función de la que se realiza el seguimiento.
Los sondeos return se activan cuando la función de la que se realiza el seguimiento devuelve o realiza una llamada de cola a otra función. El valor de arg0 es el desplazamiento en la función de la instrucción return; arg1 retiene el valor de return.
El uso de argN devuelve los datos no procesados sin filtrar como int64_t. El proveedor pid no admite el formato args[N].
El proveedor pid le permite realizar un seguimiento de cualquier instrucción de una función. Por ejemplo, para realizar un seguimiento de la instrucción 4 bytes en una función main(), podría utilizar un comando similar al del siguiente ejemplo:
pid123:a.out:main:4
Cada vez que el programa ejecute la instrucción en la dirección main+4 se activará este sondeo. Los argumentos de los sondeos de desplazamiento no están definidos. La matriz uregs[] le ayudará a examinar el estado del proceso en estas ubicaciones de sondeo. Consulte Matriz uregs[] para obtener más información.
El proveedor pid utiliza el mecanismo de estabilidad de DTrace para describir sus estabilidades, tal y como se muestra en la siguiente tabla. Para obtener más información sobre el mecanismo de estabilidad, consulte el Capítulo 39Estabilidad.
Elemento |
Estabilidad del nombre |
Estabilidad de los datos |
Clase de dependencia |
---|---|---|---|
Proveedor |
Evolutivo |
Evolutivo |
ISA |
Módulo |
Privado |
Privado |
Desconocido |
Función |
Privado |
Privado |
Desconocido |
Nombre |
Evolutivo |
Evolutivo |
ISA |
Argumentos |
Privado |
Privado |
Unknown |