printa() 関数は、D プログラム内の集積体の結果の書式設定に使用します。この関数は、次のいずれかの形式で呼び出します。
printa(@aggregation-name); printa(format-string, @aggregation-name);
最初の形式を使用した場合、dtrace(1M) コマンドは、集積体 aggregation-name のデータのスナップショットを取り、集積体のデフォルト出力書式 (第 9 章集積体を参照) と同じ書式で結果を出力します。
2 番目の形式を使用した場合、dtrace(1M) コマンドは、集積体 aggregation-name のデータのスナップショットを取り、次の規則に従って format string に指定された変換を適用し、その結果を出力します。
集積体を作成する際に使用した組署名と一致する書式変換を使用する必要があります。組要素は、それぞれ 1 回ずつ使用できます。たとえば、次の D 文でカウントを集積するとします。
@a["hello", 123] = count(); @a["goodbye", 456] = count();
さらに、プローブ節に D 文 printa(format-string , @a) を追加すると、dtrace は集積体 aggregation-name のデータのスナップショットを取り、次の文を入力したときと同じ結果を出力します。
printf(format-string, "hello", 123); printf(format-string, "goodbye", 456);
集積体内に定義された各組についても同様です。
printf() の場合と異なり、printa() で使用する書式設定文字列には、組要素をすべて含める必要はありません。たとえば、長さ 3 の組と、書式変換 1 つだけを使用することも可能です。したがって、printa() 出力では、任意の組キーを省略できます。このためには、集積体の宣言に変更を加えて、省略したいキーを組の末尾に移動し、そのキーに対応する変換指定子を printa() 書式設定文字列から除外します。
出力に集積体の結果を含めるには、printa と併用する場合にかぎり有効な、書式設定フラグ文字 @() を追加します。@ フラグは、任意の適切な書式変換指定子と組み合わせて使用できます。また、単一の書式設定文字列内で複数回使用できます。このため、組の結果がどこに出力されるかは決まっておらず、場合によっては複数回出力されることもあります。集積関数と組み合わせて使用することができる変換指定子は、集積関数の結果の型によって決まります。集積体の結果の型は、次のとおりです。
avg() |
uint64_t |
count() |
uint64_t |
lquantize() |
int64_t |
max() |
uint64_t |
min() |
uint64_t |
quantize() |
int64_t |
sum() |
uint64_t |
たとえば、avg() の結果に書式を設定するには、%d、%i、%o、%u、%x のいずれかの書式変換を適用します。関数 quantize() と lquantize() は、結果を単一の値ではなく、ASCII テーブルとして書式設定します。
以下に、printa() を使用する D プログラムの例を示します。この例では、profile プロバイダを使って caller の値を収集し、結果を単純なテーブルとして書式設定しています。
profile:::profile-997 { @a[caller] = count(); } END { printa("%@8u %a\n", @a); }
dtrace でこのプログラムを実行し、しばらく待ってから Control-C キーを押します。すると、次のような出力が得られます。
# 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 ... |