ustack
ユーザー・スタック・トレースを指定バッファに記録します。
stack ustack([uint32_t nframes, uint32_t strsize])
ustack
関数は、ユーザー・スタック・トレースを指定バッファに記録します。ユーザー・スタックの深さは、最大でもnframesです。nframesを指定しない場合は、ustackframes
オプションで指定された数のスタック・フレームが記録されます。ustack
はプロープの起動時にコール側フレームのアドレスを決定できますが、スタック・フレームはustack
関数がDTraceユーティリティによってユーザー・レベルで処理されるまでシンボルに変換されません。strsizeにゼロ以外の値が指定された場合、ustack
は指定された容量の文字列空間を割り当ててから、これを使用してカーネルから直接アドレスからシンボルへ変換します。このような直接のユーザー・シンボル変換は、DTraceでこの使用方法をサポートするスタックトレース・ヘルパーとともにのみ使用されます。そのようなフレームが変換できない場合、そのフレームは16進のアドレスとしてのみ表示されます。
ustack
シンボル変換はスタック・データが記録された後に発生します。したがって、シンボル変換が実行可能になる前に対応するユーザー・プロセスが終了し、スタック・フレーム変換が不可能になる場合があります。シンボル変換が実行される前にユーザー・プロセスが終了した場合、dtraceは警告メッセージに続いて16進のスタック・フレームを出力します。
例7-63 ustackを使用してアドレスからシンボルへの変換を行わないスタックをトレースする方法
この例では、ustack
を使用して、dateコマンドでopenat
システム・コールのスタックをトレースする方法を示します。
sudo dtrace -qn syscall::openat:entry'/pid == $target/{ustack();}' -c 'date'
次のような出力が生成されます:
CPU ID FUNCTION:NAME
2 147861 openat:entry
libc.so.6`__open64_nocancel+0x45
Mon 20 Feb 17:38:15 GMT 2023
libc.so.6`_nl_find_locale+0xfc
libc.so.6`setlocale+0x1cf
date`0x556ebae140ad
0x7a696c616d726f6e
2 147861 openat:entry
0x7f6d63fc2e65