Eléments de shell pris en charge

La syntaxe de langage Vue inclut la prise en charge des variables de shell identifiées par le préfixe $ , telles que les variables de shell exportées et les paramètres positionnels (arguments du script).

Les variables de shell Vue peuvent apparaître n'importe où dans le script Vue . Ils peuvent faire partie de la spécification de sonde, être utilisés dans des prédicats ou dans des instructions dans des blocs d'action. Cependant, contrairement à un script shell, ils ne sont pas développés s'ils sont utilisés dans des chaînes entre guillemets.

Les arguments transmis de la ligne de commande au script sont référencés dans le script en tant que $ 1, $ 2, $ 3, etc. Prenez en compte le script Vue suivant:

/* Program name: myscript.e */
	@@syscall:*:read:entry
		when (__pid == $1)

	{
		int count;
		count++;
	}

Dans l'exemple suivant, l'ID de processus du processus exécutant le programme myprog remplace $ 1 dans le script précédent. Il suppose que le programme shell prgrep , qui imprime l'ID de processus en fonction du nom de processus, est utilisé pour appeler le script Vue .

probevue myscript.e `prgrep myprog`

Les variables d'environnement exportées à partir du shell peuvent également être référencées dans le script à l'aide de l'opérateur $ . Prenez en compte le script Vue suivant:

/* Program name: myscript2.e */
	@@syscall:*:read:entry
		when (__pid == $PID)

	{
		int count;
		count++;
	}

	/* program to be traced has a function called 'foo' */
	
	@@uft:$PID:*:foo:entry
	{
		printf("Read system call was invoked %d times\n", count);
	}

Dans l'exemple suivant, 3243 remplace $PID dans le script précédent:

PID=3423 probevue myscript2.e

Si une variable d'environnement doit être reconnue en tant que chaîne dans le script ProbeVue , la valeur de la variable d'environnement doit inclure les guillemets qui l'identifient en tant que chaîne. Par exemple, le script suivant capture la sortie de trace lorsqu'un fichier spécifique est ouvert dans le système:

/* Program name: stringshell.e */
	int open(char *path, int oflag);
	@@syscall:*:open:entry
	{
		String s[40]; 
		s = get_userstring(__arg1, -1);
		if (s == $FILE_NAME) {
			printf("pid %d (uid %d) opened %s\n",__pid,__uid, s);
			exit();
		}
	}

Le script s'attend à ce que $FILE_NAME soit le nom d'une variable d'environnement shell exportée, qui inclut le guillemet dans sa valeur. Le script suivant est un exemple:

	export FILE_NAME=\"/etc/passwd\"
	probevue stringshell.e

Si la valeur d'une variable d'environnement existante qui ne comporte pas de guillemets est requise dans un script, une nouvelle variable d'environnement doit être construite à l'aide de guillemets autour de la variable d'environnement existante. Le script suivant est un exemple:

	export FILE_NAME=\"$HOME\"
	probevue stringshell.e

Vue prend en charge deux variables d'environnement spéciales qui sont utiles lorsque le processus à sonder est démarré par la commande probevue elle-même à l'aide de l'indicateur -X . La variable d'environnement $__CPID indique l'ID de processus du processus enfant créé par la commande probevue et la variable d'environnement $__CTID indique son ID d'unité d'exécution. L'indicateur -X est utile pour sonder les processus de courte durée, en particulier à des fins de débogage.

Un script Vue peut être exécuté directement (comme un script shell) en définissant la première ligne sur le script suivant:

#!/usr/bin/probevue

La commande probevue peut également lire le script Vue à partir d'une entrée standard, comme le fait le shell. Pour ce faire, vous pouvez omettre le nom de fichier du script à partir de la ligne de commande. Ceci est utile pour tester des scripts courts.

Vue ne prend pas en charge les paramètres de shell spéciaux tels que $$ et $ @ qui sont créés en interne par le shell.

Fonctions de capture de trace

ProbeVue prend en charge des fonctions de capture de trace complètes. L'action de capture de trace de base est fournie via la fonction printf qui peut être appelée à partir de n'importe quelle sonde dans le cadre du bloc d'action. La version Vue de la fonction printf est équipée de la plus grande partie de la puissance de la version de la bibliothèque C. Une deuxième fonction de capture de trace est la fonction trace . La fonction trace accepte une variable unique comme paramètre et copie sa valeur au format hexadécimal imprimable dans la mémoire tampon de trace. Cette fonction est particulièrement utile pour le vidage du contenu des chaînes et des structures. La fonction stktrace est une autre fonction de capture de trace qui capture la trace de pile de l'unité d'exécution tracée au point d'analyse en cours.

Outre les valeurs des variables de script internes, les variables externes telles que les variables globales du noyau, les données contextuelles telles que les paramètres de la fonction sondée, les valeurs de retour d'une fonction, etc., peuvent également être capturées et affichées via ces fonctions de capture de trace.

Le rapporteur de trace affiche toujours les données de trace par ordre d'heure d'occurrence et, par conséquent, les données capturées à partir de différentes unités centrales sont triées en interne avant d'être générées.