Manuel de suivi dynamique Solaris

Actions destructrices de processus

Certaines actions destructrices ne le sont que dans un processus particulier. Ces actions sont disponibles pour les utilisateurs disposant de privilèges dtrace_proc ou dtrace_user. Pour plus d'informations sur les privilèges de sécurité DTrace, reportez-vous au Chapitre35Sécurité.

stop()

void stop(void)

L'action stop() force le processus qui déclenche l'arrêt de la sonde activée lorsque celle-ci quitte le noyau, comme si elle était arrêtée par une action proc(4). L'utilitaire prun(1) peut être utilisé pour la reprise d'un processus ayant été arrêté par l'action stop(). L'action stop() peut être utilisée pour arrêter un processus à un point de sonde DTrace quelconque. Cette action peut être utilisée pour capturer un programme dans un état particulier, qu'il serait difficile d'obtenir avec un point d'interruption simple puis pour joindre au processus un débogueur classique tel que mdb(1). Vous pouvez également utiliser l'utilitaire gcore(1) pour enregistrer l'état d'un processus arrêté dans un fichier Core à des fins d'analyses ultérieures.

raise()

void raise(int signal)

L'action raise() envoie le signal spécifié au processus en cours d'exécution. Recourir à cette action revient à utiliser la commande kill(1) permettant d'envoyer un signal à un processus. Il est possible d'utiliser l'action raise() pour envoyer un signal à un point précis de l'exécution d'un processus.

copyout()

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

L'action copyout() copie nbytes à partir du tampon buf à l'adresse addr dans l'espace d'adressage du processus associé au thread actuel. Si l'adresse de l'espace utilisateur ne correspond pas à une page valide, par défaut, dans l'espace d'adressage, une erreur est générée.

copyoutstr()

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

L'action copyoutstr() copie la chaîne str vers l'adresse addr dans l'espace d'adressage du processus associé au thread actuel. Si l'adresse de l'espace utilisateur ne correspond pas à une page valide, par défaut, dans l'espace d'adressage, une erreur est générée. La longueur de chaîne est limitée à la valeur définie par l'option strsize. Pour de plus amples informations, reportez-vous au Chapitre16Options et paramètres réglables.

system()

void system(string program, ...) 

L'action system() provoque l'exécution du programme program comme s'il était saisi dans le shell. La chaîne program peut contenir n'importe quelle conversion de format printf()/printa. () Des arguments correspondant aux conversions de format doivent être spécifiés. Pour plus d'informations sur les conversions dans des formats valides, reportez-vous au Chapitre12Format de sortie.

L'exemple suivant exécute la commande date(1) une fois par seconde :


# 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

L'exemple suivant illustre une utilisation élaborée de l'action, avec des conversions printf() dans la chaîne program et des outils de filtre traditionnels comme des tubes :

#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);
}

Exécuter le script ci-dessus engendre une sortie similaire à l'exemple suivant :


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

L'exécution de la commande spécifiée n'a pas lieu dans le cadre du déclenchement d'une sonde, mais lorsque le tampon contenant les détails sur l'action system() est traité au niveau utilisateur. La manière dont ce traitement a lieu et le moment auquel il a lieu dépendent de la stratégie de mise en tampon, décrite dans le Chapitre11Tampons et mise en tampon Avec la stratégie de mise en tampon par défaut, la vitesse de traitement du tampon est spécifiée par l'option switchrate. Vous pouvez voir le délai inhérent au system() si vous réglez de façon explicite switchrate sur une vitesse supérieure à la valeur par défaut de une seconde, comme illustré dans l'exemple suivant :

#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);
}

Exécuter le script ci-dessus engendre une sortie similaire à l'exemple suivant :


# 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

Vous remarquerez que les valeurs walltime diffèrent mais que les valeurs date sont identiques. Ce résultat reflète le fait que l'exécution de la commande date(1) a eu lieu uniquement lors du traitement du tampon et non lors de l'enregistrement de l'action system().