Variables de clase de salida

Las cláusulas asociadas con un punto de sondeo que se encuentra en los puntos de ubicación de salida de una llamada de sistema o función de usuario pueden acceder al valor de retorno de la llamada de sistema o función de usuario.

Sólo hay una variable de clase de salida definida por el idioma Vue . Es el valor de retorno de una función o una llamada al sistema, a la que se puede acceder utilizando el nombre de variable incorporada especial __rv.

Los analizadores en los puntos de ubicación de salida están soportados por el gestor de analizadores de llamadas del sistema. Por ejemplo, la llamada al sistema read devuelve el número real de bytes leídos o un código de error -1. Se puede acceder a este valor devuelto en el punto de analizador @@syscall: * :read:exit , que identifica todos los puntos de salida de la llamada de sistema de lectura.

De forma similar a las variables de clase de entrada, el uso de variables de clase de salida en una cláusula Vue sólo está permitido si la especificación de analizador asociada a la cláusula identifica un punto de analizador exclusivo. Por lo tanto, __rv no se puede utilizar en una cláusula Vue que tenga varios puntos de analizador especificados en la especificación de analizador. Además, la declaración de estilo C de la función que se está sondeando, específicamente el tipo de datos del valor de retorno, debe proporcionarse explícitamente en el script Vue. De hecho, es un error especificar una declaración de función sin proporcionar su tipo de retorno.

Puede utilizar variables de clase de salida en la sección de predicado de una cláusula.

El script siguiente es un script no permitido y hará que el compilador ProbeVue falle con un error de sintaxis puesto que no se ha especificado el tipo de retorno de la función read :

/* Bad example.  */

	int read(int fd, char *buf, unsigned long size);

	@@syscall:*:read:exit
		when (__rv > 0)
	{
		/* Entered on read success: return value = # of bytes read */
		printf("Number of bytes read = %d\n", __rv);
	}

El siguiente script modificado puede funcionar:

/* Good example.  */

	int read(int fd, char *buf, unsigned long size);

	@@syscall:*:read:exit
		when (__rv > 0)
	{
		/* Entered on read success: return value = # of bytes read */
		printf("Number of bytes read = %d\n", __rv);
	}