La fonction printa() est utilisée pour formater les résultats de groupements dans un programme D. La fonction est appelée sous l'un des deux formats suivants :
printa(@aggregation-name); printa(format-string, @aggregation-name);
Si le premier format de la fonction est utilisé, la commande dtrace(1M) prend un instantané cohérent des données de groupement et produit une sortie équivalente au format de sortie par défaut utilisé pour les groupements, décrit dans le Chapitre9Groupements.
Si le second format de la fonction est utilisé, la commande dtrace(1M) prend un instantané cohérent des données de groupement et produit une sortie selon les conversions spécifiées dans la chaîne de format, en fonction des règles suivantes :
Les conversions de format doivent correspondre à la signature de tuple utilisée pour créer le groupement. Chaque élément de tuple ne peut s'afficher qu'une seule fois. Par exemple, si vous regroupez un compte avec les instructions D suivantes :
@a["hello", 123] = count(); @a["goodbye", 456] = count();
puis ajoutez l'instruction D printa(chaîne-format, @a) à une clause de sonde, dtrace prendra un instantané des données de groupement et produira une sortie comme si vous aviez saisi les instructions :
printf(format-string, "hello", 123); printf(format-string, "goodbye", 456);
et ainsi de suite pour chaque tuple défini dans le groupement.
Contrairement à printf(), la chaîne de format utilisée pour printa() ne doit pas nécessairement inclure tous les éléments du tuple. Cela signifie que vous pouvez disposer d'un tuple ayant comme longueur 3 avec une seule conversion de format. Par conséquent, vous pouvez omettre n'importe quelle clé de tuple de votre sortie printa() en modifiant votre déclaration de groupement pour déplacer les clés que vous souhaitez omettre à la fin du tuple, puis omettre les spécificateurs de conversion leur correspondant dans la chaîne de format printa().
Le résultat du groupement peut être inclus dans la sortie en utilisant le caractère supplémentaire d'indicateur de format @, valide uniquement s'il est utilisé avec printa(). L'indicateur @ peut être combiné avec n'importe quel spécificateur de conversion de format et peut s'afficher plusieurs fois dans une chaîne de format de façon à ce que votre résultat de tuple puisse s'afficher n'importe où dans la sortie et à plusieurs reprises. L'ensemble des spécificateurs de conversion pouvant être utilisés avec chaque fonction de groupement dépend du type de résultat de la fonction de groupement. Les types de résultat de groupement sont les suivants :
avg() |
uint64_t |
count() |
uint64_t |
lquantize() |
int64_t |
max() |
uint64_t |
min() |
uint64_t |
quantize() |
int64_t |
sum() |
uint64_t |
Par exemple, pour formater les résultats de avg(), vous pouvez appliquer les conversions de format %d, %i, %o, %u, ou %x. Les fonctions quantize() et lquantize() formatent leur résultat sous la forme d'un tableau ASCII plutôt que sous la forme d'une valeur unique.
Le programme D suivant montre un exemple complet de printa(), avec le fournisseur profile pour tester la valeur de caller puis en formatant les résultats sous la forme d'un tableau simple :
profile:::profile-997 { @a[caller] = count(); } END { printa("%@8u %a\n", @a); }
Si vous utilisez dtrace pour exécuter ce programme, patientez quelques secondes puis appuyez sur Control-C ; une sortie similaire à l'exemple suivant s'affiche :
# 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 ... |