Guía de seguimiento dinámico de Solaris

Acciones destructivas de procesos

Algunas acciones son sólo destructivas para un proceso determinado. Estas acciones están disponibles para los usuarios con los privilegios dtrace_proc o dtrace_user. Consulte el Capítulo 35Seguridad para obtener más información sobre los privilegios de seguridad de DTrace.

stop()

void stop(void)

La acción stop() fuerza la detención del proceso que activa el sondeo habilitado cuando se abandona el núcleo a continuación, como si lo hubiera detenido la acción proc(4). La utilidad prun(1) puede usarse para reanudar un proceso detenido por la acción stop(). La acción stop() puede utilizarse para detener un proceso en cualquier punto del sondeo de DTrace. Esta acción puede utilizarse para capturar un programa en un estado específico que sería difícil de conseguir con un simple punto de interrupción y, a continuación, adjuntar al proceso un depurador tradicional como, por ejemplo, mdb(1). También puede usar la utilidad gcore(1) para guardar el estado de un proceso detenido en un archivo del núcleo central para su posterior análisis.

raise()

void raise(int signal)

La acción raise() envía la señal especificada al proceso que se está ejecutando en ese momento. Esta acción es similar al uso del comando kill(1) para enviar una señal a un proceso. La acción raise() puede utilizarse para enviar una señal en un momento específico de la ejecución de un proceso.

copyout()

void copyout(void *buf, uintptr_t addr, size_t nbytes)

La acción copyout() copia nbytes de la memoria intermedia especificada por buf en la dirección especificada por addr en el espacio de direccionamiento del proceso asociado al subproceso actual. Si la dirección de espacio de usuario no se corresponde con una página fallida válida en el espacio de direccionamiento actual, se generará un error.

copyoutstr()

void copyoutstr(string str, uintptr_t addr, size_t maxlen)

La acción copyoutstr() copia la cadena especificada por str en la dirección especificada por addr en el espacio de nombre del proceso asociado al subproceso actual. Si la dirección de espacio de usuario no se corresponde con una página fallida válida en el espacio de direccionamiento actual, se generará un error. La longitud de la cadena está limitada por el valor definido por la opción strsize. Consulte el Capítulo 16Opciones y optimizables para obtener más información.

system()

void system(string program, ...) 

La acción system() provoca que se ejecute el programa especificado por program como si se hubiera especificado en la shell como entrada. La cadena program puede contener cualquiera de las conversiones de formato de printf()/printa. () Deben especificar los argumentos que coincidan con las conversiones de formato. Consulte el Capítulo 12Formato de salida para obtener información sobre las conversiones de formato válidas.

En el ejemplo siguiente, se ejecuta el comando date(1) una vez por segundo:


# dtrace -wqn tick-1sec'{system("date")}'
 Tue Jul 20 11:56:26 CDT 2004
 Tue Jul 20 11:56:27 CDT 2004
 Tue Jul 20 11:56:28 CDT 2004
 Tue Jul 20 11:56:29 CDT 2004
 Tue Jul 20 11:56:30 CDT 2004

En el siguiente ejemplo, se muestra un uso más elaborado de la acción, utilizando las conversiones de printf() en la cadena program junto con las herramientas de filtrado tradicionales como, por ejemplo, las conducciones:

#pragma D option destructive
#pragma D option quiet

proc:::signal-send
/args[2] == SIGINT/
{
	printf("SIGINT sent to %s by ", args[1]->pr_fname);
	system("getent passwd %d | cut -d: -f5", uid);
}

La ejecución de la secuencia de comandos anterior devuelve una salida similar al siguiente ejemplo:


# ./whosend.d
SIGINT sent to MozillaFirebird- by Bryan Cantrill
SIGINT sent to run-mozilla.sh by Bryan Cantrill
^C
SIGINT sent to dtrace by Bryan Cantrill

La ejecución de los comandos especificados no se produce en el contexto de la activación del sondeo, sino cuando la memoria intermedia que contiene los detalles de la acción system() se procesa a nivel de usuario. El momento y la ubicación en que tiene lugar este procesamiento dependen de la directiva de almacenamiento en memoria intermedia, descrita en el Capítulo 11Memorias intermedias y almacenamiento en memoria intermedia. Con la directiva de almacenamiento en memoria intermedia, la velocidad de procesamiento se especifica mediante la opción switchrate. Puede observar el retraso inherente a system() si ajusta de forma explícita switchrate con un valor superior al valor predeterminado de un segundo, como se muestra en el siguiente ejemplo:

#pragma D option quiet
#pragma D option destructive
#pragma D option switchrate=5sec

tick-1sec
/n++ < 5/
{
	printf("walltime  : %Y\n", walltimestamp);
	printf("date      : ");
	system("date");
	printf("\n");
}

tick-1sec
/n == 5/
{
	exit(0);
}

La ejecución de la secuencia de comandos anterior devuelve una salida similar al siguiente ejemplo:


# dtrace -s ./time.d
 walltime  : 2004 Jul 20 13:26:30
date      : Tue Jul 20 13:26:35 CDT 2004

walltime  : 2004 Jul 20 13:26:31
date      : Tue Jul 20 13:26:35 CDT 2004

walltime  : 2004 Jul 20 13:26:32
date      : Tue Jul 20 13:26:35 CDT 2004

walltime  : 2004 Jul 20 13:26:33
date      : Tue Jul 20 13:26:35 CDT 2004

walltime  : 2004 Jul 20 13:26:34
date      : Tue Jul 20 13:26:35 CDT 2004

Tenga en cuenta que el valor de walltime varía, aunque los valores de date sean idénticos. Este resultado refleja el hecho de que la ejecución del comando date(1) sólo se ha producido cuando se ha procesado la memoria intermedia y no cuando se ha registrado la acción system().