La función printa() se utiliza para dar formato a los resultados de las adiciones en un programa D. Se puede llamar a esta función con uno de los dos formatos siguientes:
printa(@aggregation-name); printa(format-string, @aggregation-name);
Si se utiliza el primer formato de la función, el comando dtrace(1M) realiza una captura uniforme de los datos de la adición y genera una salida conforme al formato de salida predeterminado utilizado para las adiciones, como se describe en el Capítulo 9Adiciones.
Si se utiliza el segundo formato de la función, el comando dtrace(1M) realiza una captura uniforme de los datos de la adición y genera una salida conforme a las conversiones especificadas en la cadena de formato, de acuerdo con las siguientes reglas:
Las conversiones de formato deben coincidir con la firma de tupla utilizada para crear la adición. Cada elemento de la tupla sólo puede aparece una vez. Por ejemplo, si se agrega un recuento utilizando las siguientes instrucciones de D:
@a["hello", 123] = count(); @a["goodbye", 456] = count();
y, a continuación, se agrega la instrucción de D printa(format-string, @a) a una cláusula del sondeo, dtrace efectuará una captura de los datos de la adición como si se hubieran introducido las instrucciones:
printf(format-string, "hello", 123); printf(format-string, "goodbye", 456);
y así sucesivamente para cada tupla definida en la adición.
A diferencia de printf(), no es necesario que la cadena de formato utilizada para printa() incluya todos los elementos de la tupla. Es decir, puede tener una tupla con una longitud de 3 y sólo una conversión de formato. Por lo tanto, puede omitir cualquier clave de tupla de la salida de printa() cambiando la declaración de la adición para transferir las claves que desee omitir al final de la tupla y, a continuación, omitir los especificadores de conversión correspondientes en la cadena de formato printa().
El resultado de la adición puede incluirse en la salida mediante el carácter de indicador de formato @, que sólo es válido cuando se utiliza con printa(). El indicador @ puede combinarse con cualquier especificador de conversión de formato adecuado y aparecer varias veces en una cadena de formato, por lo que el resultado de la tupla puede aparecer en cualquier ubicación de la salida y en más de una ocasión. El tipo de resultado de la función de adición determina el conjunto de especificadores de conversión que pueden utilizarse con cada función de adición. Los tipos de resultados de la adición son:
avg() |
uint64_t |
count() |
uint64_t |
lquantize() |
int64_t |
max() |
uint64_t |
min() |
uint64_t |
quantize() |
int64_t |
sum() |
uint64_t |
Por ejemplo, para dar formato a los resultados de avg(), puede aplicar las conversiones de formato %d, %i, %o, %u o %x. Las funciones quantize() y lquantize() dan a sus resultados un formato de tabla ASCII en lugar de un formato de valor único.
El siguiente programa D muestra un ejemplo completo de printa() utilizando el proveedor profile para obtener una muestra del valor de caller y, a continuación, dar un formato de tabla simple a los resultados:
profile:::profile-997 { @a[caller] = count(); } END { printa("%@8u %a\n", @a); }
Si utiliza dtrace para ejecutar este programa, espere unos segundos y pulse Control-C para ver una salida similar a la siguiente:
# dtrace -s printa.d ^C CPU ID FUNCTION:NAME 1 2 :END 1 0x1 1 ohci`ohci_handle_root_hub_status_change+0x148 1 specfs`spec_write+0xe0 1 0xff14f950 1 genunix`cyclic_softint+0x588 1 0xfef2280c 1 genunix`getf+0xdc 1 ufs`ufs_icheck+0x50 1 genunix`infpollinfo+0x80 1 genunix`kmem_log_enter+0x1e8 ... |