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