機械翻訳について

ustack

ユーザー・スタック・トレースを指定バッファに記録します。

stack ustack([uint32_t nframes, uint32_t strsize])

ustack関数は、ユーザー・スタック・トレースを指定バッファに記録します。 ユーザー・スタックの深さは、最大でもnframesです。 nframesを指定しない場合は、ustackframesオプションで指定された数のスタック・フレームが記録されます。 ustackはプロープの起動時にコール側フレームのアドレスを決定できますが、スタック・フレームはustack関数がDTraceユーティリティによってユーザー・レベルで処理されるまでシンボルに変換されません。 strsizeが指定され、ゼロ以外の場合、ustackは指定された量の文字列領域を割り当て、それを使用してカーネルから直接アドレスからシンボルへの変換を実行します。 このような直接のユーザー・シンボル変換は、DTraceでこの使用方法をサポートするスタックトレース・ヘルパーとともにのみ使用されます。 そのようなフレームが変換できない場合、そのフレームは16進のアドレスとしてのみ表示されます。

ustackシンボル変換はスタック・データが記録された後に発生します。 したがって、シンボル変換が実行可能になる前に対応するユーザー・プロセスが終了し、スタック・フレーム変換が不可能になる場合があります。 シンボル変換が実行される前にユーザー・プロセスが終了した場合、dtraceは警告メッセージに続いて16進のスタック・フレームを出力します。

例8-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