Solaris man マニュアル
ユーザーコマンド                                         truss(1)

【名前】
     truss - システムコールとシグナルの追跡

【形式】
     truss [-fcaeildDE] [ - [tTvx] [!] syscall , ...]  [  -  [sS]
     [!]  signal , ...] [ - [mM] [!] fault , ...] [ - [rw] [!] fd
     , ...] [ - [uU] [!] lib , ... :  [:]  [!]  func  ,  ...]  [-
     o outfile] command | -p pid[/lwps] ...

【機能説明】
     truss ユーティリティーは指定されたコマンドを実行し、それ自体
     が実行するシステムコール、受け取ったシグナル、および検出した
     マシン障害の追跡情報を生成します。追跡出力の各行には、障害ま
     たはシグナルの名前、あるいはシステムコール名とその引数および
     戻り値が示されます。システムコールの引数は、可能なかぎの、関
     連するシステムヘッダー内の定義に従って記号で表示されます (パ
     ス名へのポインタ引数の場合、ポイント先の文字列が表示さ れ る
     )。エラーが発生した場合の戻り値は、intro(3) のマニュアルペー
     ジに説明されているエラーコード名を使用して報告されま す。 エ
     ラーが発生して、カーネルが失われた特権を報告する場合、特権名
     (privileges(5) を参照) は、エラーコード名の後に、角括 弧  ([
     ]) で囲まれて報告されます。

     truss は、-u オプションにより、追跡するプロセスによって実 行
     されたユーザーレベルの関数呼び出しの開始および終了時の追跡情
     報も生成します。この場合、入れ子レベルを示すためにインデント
     が行われます。

【オプション】
     以下のオプションを指定できます。リスト引数を受け付ける オ プ
     ションでは、リスト内のすべての可能なメンバーを指定する短縮形
     として名前 all を使用できます。リストが ! で始まるオプション
     は 否定を意味します (たとえば、追跡せずに除外するなど)。同じ
     オプションを複数回指定できます。リスト内の同じ名前に対 し て
     は、あとから指定されたオプションが先に指定されているオプショ
     ン (リスト内で左側にあるもの) を無効にします。

     次のオプションを指定できます。

     -p

         truss に指定される command 引数を、実行されるコマンド と
         してではなく、既存のプロセス (ps(1) のマニュアルページを
         参照) のプロセス ID のリストとして解釈します。プロセスの
         ユー ザーID とグループ ID が実行するユーザーの ID と一致
         するか、あるいはユーザーが特権ユーザーである場合、 truss
         は各プロセスを制御し、それらの追跡を開始します。ユーザー
         は、選択した (つまり、/thread-id をプロセス ID に追加 し
         た) スレッドだけを追跡できます。複数のスレッドを選択する
         には、区切り文字「-」と「,」を使用します。 た と え ば、
         「/1,2,7-9」は、スレッド 1、2、7、8、および 9 を追跡しま
         す。プロセスの指定は、/proc ディレクトリ内の名前を指定す
         ることによっても行えます (例: /proc/12345)。



     -f

         fork() または vfork() によって作成されたすべての子プロセ
         スを追跡し、それらのシグナル、障害、およびシステムコール
         を追跡出力に含めます。通常は、最初のコマンドまたはプロセ
         ス だけが追跡されます。-f を指定すると、追跡出力の各行に
         プロセス ID が表示され、どのプロセスがシステムコールを実
         行したか、あるいはどのプロセスがシグナルを受信したかが示
         されます。



     -c

         追跡情報を 1 行ずつ表示するのではなく、追跡されたシス テ
         ムコール、障害、およびシグナルをカウントします。追跡され
         たコマンドが終了するか、あるいは truss が割り込まれた と
         き に、要約レポートが生成されます。-f も指定すると、子プ
         ロセスについて追跡されたシステムコール、障害、およびシグ
         ナルもすべてカウントに含められます。



     -a

         各 exec() システムコールに渡される引数文字列を表示 し ま
         す。



     -e

         各 exec() システムコールに渡される環境文字列を表示 し ま
         す。



     -E

         追跡出力の各行に差分時間を含めます。seconds.fraction  と
         いう形式で示されるこの値は、システムコールが始まってから
         終わるまでの経過時間を示します。

         -D オプションとは異なり、この時間は、システムコール内 で
         費やされた総時間です。



     -i

         割り込み可能な休眠状態のシステムコールを表示しません。端
         末デバイスまたはパイプ上での open() や read() など、特定
         のシステムコールは不確定時間に休眠でき、割り込み可 能 で
         す。 一般に、システムコールが 1 秒を超えてそのような休眠
         状態になっている場合、truss はそれらを報告します。システ
         ム コールは完了時に再度、報告されます。-i オプションは、
         そのようなシステムコールを、完了時のみの 1 度だけ報告 し
         ます。



     -l

         追跡出力の各行に対応する軽量プロセス (LWP) の ID を含 め
         ま す。-f も指定すると、プロセス ID と LWP ID の両方を含
         めます。



     -d

         追跡出力の各行にタイムスタンプを含めます。タイムスタンプ
         は、 seconds.fraction という形式で行頭に示されます。これ
         は、追跡の開始時からの経過秒数を示したものです。追跡出力
         の最初の行には、epoch (time(2) のマニュアルページを参照)
         以後の経過秒数として、個々のタイムスタンプ測定の基点とな
         るベースタイムおよび、開始時の日付が表示されます。報告さ
         れる時間は、当該イベントが発生した時間です。どのシステム
         コー ル についても、イベントはシステムコールの終了時であ
         り、システムコールの開始時ではありません。



     -D

         追跡出力の各行にデルタタイムを含めます。seconds.fraction
         という形式で示されるこの値は、LWP が呼び出したイベントの
         前回の報告以降にそのイベントが次に発生した時点までの経過
         時間を示します。システムコールの場合、これはシステムコー
         ル内で経過した時間ではありません。



     -t [!]syscall,...

         追跡または除外するシステムコールを指定します。コンマで区
         切っ た リストに指定されたシステムコールの追跡が行われま
         す。リストが ! で始まる場合、指定したシステムコールが 追
         跡出力から除外されます。デフォルトは -tall です。


     -T [!]syscall,...

         プロセスを停止するシステムコールを指定します。指定された
         シ ステムコールが、-t によって指定されるセットに追加され
         ます。指定されたシステムコールの 1 つが見つかると、truss
         は プロセスを停止したままにし、終了します。つまり、truss
         はプロセスを解放して実行を終了しますが、当該システムコー
         ルの完了時にそのプロセスを停止状態のままにします。これに
         より、停止したプロセスにデバッガなどのプロセス検査ツール
         (proc(1)  のマニュアルページを参照) を適用できるようにな
         ります。追跡を継続するには、同じオプションまたは異なるオ
         プ ションを指定して、停止されたプロセスに truss を適用し
         直します。デフォルトは -T!all です。

         この方法で停止されたままになったプロセスは、アプ リ ケー
         ション kill -CONT によって再開することはできません。これ
         は、停止シグナル (signal(3HEAD) のマニュアルページを参照
         ) のデフォルトアクションによってではなく、/proc を介した
         イベント上でこのプロセスが停止されているためです。停止中
         の プ ロセスを再実行するように設定するには、proc(1) のマ
         ニュアルページで説明されている prun(1) コマンドを使用 で
         きます。



     -v [!]syscall,...

         詳細表示。指定されたシステムコールに対してアドレスで渡さ
         れ た任意の構造体の内容を表示します (-t による追跡が行わ
         れた場合)。入力した値とオペレーティングシステムによっ て
         返 さ れ る 値が示されます。入力と出力の両方に使用される
         フィールドについては、出力値だけが示されます。デフォルト
         は -v!all です。



     -x [!]syscall,...

         指定されたシステムコールの引数を raw 形式で表示 し ま す
         (-t  による追跡が行われた場合)。これは、通常、記号表示で
         はなく 16 進表示であり、raw ビットのままの方が良いと考え
         るハッカーのためのものです。



     -s [!]signal,...

         追跡または除外するシグナルを指定します。コンマで区切った
         リストに指定したシグナルを追跡します。シグナルが無視され
         る (ブロックされてない) 場合でも、追跡出力には、指定され
         た各シグナルの受信が示されます (ブロックされているシグナ
         ルはブロックが解放されるまで受信されない)。シグナル は、
         名前または番号で指定できます (<sys/signal.h> を参照)。リ
         ストが ! で始まる場合、指定されたシグナルは追跡出力か ら
         除外されます。デフォルトは -sall です。



     -S [!]signal,...

         プロセスを停止するシグナルを指定します。指定されたシグナ
         ル は、-s で指定されるセットに追加されます。指定されたシ
         グナルのどれかが受信された場合、truss はプロセスを停止し
         たままにし、終了します (-T オプションを参照)。デフォルト
         は -S!all です。



     -m [!]fault,...

         追跡または除外するマシン障害を指定します。コンマで区切っ
         たリストに指定した障害が追跡されます。障害は、名前または
         番号で指定できます (<sys/fault.h> を参照)。リストが ! で
         始まる場合、指定された障害は追跡出力から除外されます。デ
         フォルトは -mall -m!fltpage です。



     -M [!]fault,...

         プロセスを停止するマシン障害を指定します。指定した 障 害
         は、 -m で指定されるセットに追加されます。指定された障害
         の 1 つが見つかると、truss はプロセスを停止した ま ま に
         し、 終 了 し ま す  (-T オプションを参照)。デフォルトは
         -M!all です。



     -r [!]fd,...

         指定したファイル記述子の read() ごとに、入出力バッファの
         全内容を表示します。出力は行当たり 32 バイトに整形され、
         各バイトは ASCII 文字 (先頭に 1 個のブランクが入る)、 ま
         たは、水平タブ <\t> や復帰改行 <\n> などの制御文字のため
         に 2 文字の C 言語エスケープシーケンスとして表示さ れ ま
         す。ただし、ASCII 解釈が不可能な場合は、2 文字の 16 進表
         現となります (-r が指定されない場合でも追 跡 さ れ た 各
         read() の入出力バッファの最初の 12 バイトは表示される)。
         デフォルトは -r!all です。



     -w [!]fd,...

         指定したファイル記述子の write() ごとに入出力バッファ の
         内 容 を 表 示します (-r オプションを参照)。デフォルトは
         -w!all です。



     -u [!]lib,...:[:][!]func,...

         ユーザーレベルの関数呼び出しを追跡します。lib,.. は、 動
         的なライブラリ名 (.so.n 接尾辞を除く) をコンマで区切った
         リストです。func,.. は、関数名をコンマで区切ったリストで
         す。どちらの場合でも、名前の表現にメタ文字 *、?、[] を使
         用できます。これらのメタ文字の指定は  sh(1) における指定
         と同じ意味を持ちますが、ファイルに対してではなくライブラ
         リ名または関数名に対して使用されることになります。ライブ
         ラ リまたは関数のリストを空にすると、デフォルトで * が使
         用され、ライブラリ内のすべてのライブラリまたは関数が追跡
         さ れます。リストの先頭に ! を付けると、追跡から除外され
         るライブラリまたは関数の名前を指定したことになります。 1
         つのライブラリを除外すると、そのライブラリ内のすべての関
         数が除外されます。つまり、ライブラリ除外リストのあとに続
         く関数リストは無視されます。

         関数リストとライブラリリストを分離する 1 つの : は、ライ
         ブラリの外部から、それらのライブラリに対する呼び出しは追
         跡しますが、ライブラリ内部の他の関数からの呼び出しは除外
         することを意味します。2 つの :: は、呼び出し元に関係なく
         すべての呼び出しを追跡することを意味します。

         ライブラリのパターンには、正確な一致がないかぎり、実行可
         能 ファ イルと動的リンカーのいずれとも対応付けはしません
         (l* は ld.so.1 に対応付けられない)。これらのオブジェクト
         の どちらかに含まれる関数を追跡するには、       truss -u
         a.out -u ld  .. のように名前を明確に指定する必要がありま
         す。a.out はこの目的で使用されるリテラル名であり、実行可
         能ファイルの名前を意味するわけではありません。a.out 関数
         呼び出しを追跡すると、すべての呼び出しが暗黙に追跡されま
         す (デフォルトは ::)。

         -u オプションは複数回指定することが可能で、この場合左 か
         ら順に受け付けられます。プロセスが -lthread にリンクして
         いる場合は、呼び出しの追跡出力に関数呼び出しを行っ た ス
         レッドの ID が含められます。truss は、関数名を見つけるた
         めに各ライブラリ内の動的シンボルテーブルを検索するととも
         に、ストリップされてなければ標準のシンボルテーブルも検索
         します。



     -U [!]lib,...:[:][!]func,...

         プロセスを停止するユーザーレベルの関数呼び出しを指定しま
         す。 指定される関数は、-u で指定されるセットに追加されま
         す。指定された関数の 1 つが呼び出されると、truss はプ ロ
         セ スを停止したままにし、終了します (-T オプションを参照
         )。



     -o outfile

         追跡出力に使用されるファイル。デフォルトでは、出力は標準
         エラー出力に送られます。



     -t、-T、-v、および -x オプションが受け付けるシステムコール名
     に ついては、『man pages section 2: System Calls』を参照して
     ください。システムコール番号も指定できます。

     指定したコマンドを起動及び追跡するのに truss を使用 す る 場
     合、 -o オプションを使用するか、あるいは標準エラー出力を端末
     以外のファイルにリダイレクトすると、truss はハングアップ、割
     り込みシグナル、および終了シグナルを無視して動作します。これ
     により、端末からの割り込みシグナルと終了シグナルを受け取る対
     話型プログラムの追跡が容易になります。

     追跡出力を端末に転送したままにした場合、あるいは、既存のプロ
     セ スを追跡する (-p オプション) 場合、truss は追跡したすべて
     のプロセスを解放して処理を終了するので、ハングアップ、割り込
     み、終了の各シグナルに応答します。これにより、ユーザーは過度
     の追跡出力を抑制でき、既存のプロセスを解放できるようになりま
     す。解放されたプロセスは、なんの影響も受けず、それまでどおり
     の通常の処理を継続します。

【使用例】
     例 1: コマンドを追跡する

     この例は、端末上の find(1) コマンドの追跡情報を生成します。

     example$ find, -print >find.out

     例 2: 一般的なシステムコールを追跡する

     オープン、クローズ、読み取り、書き込みの各システムコールの追
     跡情報だけを表示するには、次のように指定します。

     example$ truss -t open,close,read,write find . -print >find.out

     例 3: シェルスクリプトを追跡する

     この例は、ファイル truss.out 上の spell(1) コマンドの追跡 情
     報を生成します。

     example$ truss -f -o truss.out spell document

     spell はシェルスクリプトであるため、シェルだけでなくシェルに
     よって生成されたプロセスも追跡するためには -f フラグが必要で
     す (spell スクリプトは 8 つのプロセスのパイプラインを実行 す
     る)。

     例 4: 出力を簡潔にする

     出力の 97% が lseek()、read()、および write() システムコール
     の追跡情報である冗長な例を示します。

     example$ truss nroff -mm document >nroff.out

     出力を簡潔にまとめるには次のように指定します。

     example$ truss -t !lseek,read,write nroff -mm document >nroff.out

     例 5: C ライブラリの外部からのライブラリ呼び出しを追跡する

     この例は、C ライブラリの外部から C ライブラリ内の任意の関 数
     に対して行われるユーザーレベルの呼び出しをすべて追跡します。

     example$ truss -u libc ...

     例 6: C ライブラリ内からのライブラリ呼び出しを追跡する

     この例では、C ライブラリからその C ライブラリ自体の関数に 対
     して行われる呼び出しが含められます。

     example$ truss -u libc:: ...

     例 7: C ライブラリ以外のライブラリ呼び出しを追跡する

     この例は、C ライブラリ以外のすべてのライブラリに対して行われ
     るユーザーレベルの呼び出しをすべて追跡します。

     example$ truss -u '*' -u !libc ...

     例 8: pritf および scanf 関数呼び出しを追跡する

     この例は、C ライブラリに含まれる printf および scanf ファ ミ
     リ 内 の関数に対するユーザーレベルの呼び出しをすべて追跡しま
     す。

     example$ truss -u 'libc:*printf,*scanf' ...

     例 9: ユーザーレベルの関数呼び出しをすべて追跡する

     この例は、任意の場所から任意の場所に対して行われるユーザーレ
     ベルの関数呼び出しをすべて追跡します。

     example$ truss -u a.out -u ld:: -u :: ...

     例 10: システムコールの追跡結果を詳細に表示する

     この例は、プロセス #1 の init(1M) システムコールのアクティビ
     ティを追跡し、詳細な追跡情報を表示します (特権ユーザーがこの
     コマンドを実行できます)。

     example# truss -p -v all 1

     truss に割り込みを行うと、init は通常の動作に戻ります。

【ファイル】
     /proc/*         プロセスファイル



【属性】
     次の属性については、attributes(5) のマニュアルページを参照し
     てください。
     ____________________________________________________________
    |         属性タイプ          |            属性値           |
    |_____________________________|_____________________________|
    | 使用条件                    | SUNWtoo                     |
    |_____________________________|_____________________________|

【関連項目】
     date(1), find(1), proc(1), ps(1), sh(1), spell(1), init(1M),
     intro(3),  exec(2),  fork(2),  lseek(2),  open(2),  read(2),
     time(2),  vfork(2),  write(2),  ctime(3C),  signal.h(3HEAD),
     proc(4), attributes(5), privileges(5), threads(5)

     man pages section 2: System Calls

【注意事項】
     マニュアルページのセクションでのシステムコールで説明されてい
     るシステムコールの中には、実際のオペレーティングシステムイン
     タフェースとは異なるものがあります。追跡情報が、このマニュア
     ルページの説明と若干異なる場合もあります。

     マシン障害 (ページフォルトは除く) が発生するたびに、障害の原
     因 となった LWP にシグナルが送られます。シグナルがブロックさ
     れない場合、各マシン障害 (ページフォルトを除く) が通知された
     直後に、受信シグナルが通知されます。

     オペレーティングシステムは、プロセスの追跡に一定のセ キュ リ
     ティ制限を課します。具体的には、ユーザーは、自身が読み取りで
     きないオブジェクトファイル (a.out) を持つコマンドを追跡す る
     こ とはできません。set-uid と set-gid をもつコマンドは、特権
     ユーザー以外は追跡できません。特権ユーザーが実行する場合を除
     き、truss は set-id または読み取り不可能なオブジェクトファイ
     ルの exec() を実行するプロセスを制御できません。このようなプ
     ロ セスは、truss からは独立して、exec() ポイントで通常どおり
     処理を継続します。

     ほかの制御プロセスとの衝突を防ぐため、truss は、/proc インタ
     フェースを介してほかのプロセスによって制御されているプロセス
     を追跡しません。このため、truss を proc(4) ベースのデバッ ガ
     だけでなく、それ自身の別のインスタンスにも適用できます。

     8 カラムごとに標準のタブストップが設定されていると仮定して、
     追跡出力にはタブ文字が含まれます。

     複数のプロセスまたはマルチスレッドプロセス (複数の LWP) を含
     むプロセス) の追跡出力は、厳密に時間順には生成されません。た
     とえば、パイプにおける read() は、対応する write() よりも 前
     に報告される場合があります。しかし、個々の LWP (従来型のプロ
     セスには 1 つしか含まれない) について出力は、厳密に時間順 に
     行なわれます。

     複数のプロセスを追跡する場合、truss は追跡対象のプロセスごと
     に 1 つの制御プロセスとして動作します。前述の spell コマンド
     の例の場合、spell 自身が 9 つのプロセススロット (シェル用 に
     1 つ、8 メンバーを持つパイプライン用に 8 つ) を使用し、truss
     がさらに 9 つのプロセスを追加するため、プロセススロットは 合
     計で 18 になります。

     -v オプションでは、すべてのシステムコールで渡すことができ る
     あらゆる構造体を表示できるわけではありません。