truss コマンド

目的

プロセスのシステム・コール、動的にロードされたユーザー・レベル機能のコール、 受信されたシグナル、引き起こされたマシン・フォールトをトレースします。

構文

truss [ -f] [ -c] [ -a] [ -l ] [ -d ] [ -D ] [ -e] [ -i] [ { -t | -x} [!] Syscall [...] ] [ -s [!] Signal [...] ] [ { -m }[!] Fault  [...]] [ { -r | -w} [!] FileDescriptor [...] ] [ { -u } [!]LibraryName [...]:: [!]FunctionName [ ... ] ] [ -o Outfile] {Command| -p pid [. . .]}

説明

truss コマンドは指定のコマンドを実行するか、 リストされたプロセス ID に接続して、 システム・コール、受信されたシグナル、プロセスが引き起こしたマシン・フォールトのトレースを生成します。 トレース出力の各行は、FaultSignal 名、 Syscall 名のいずれかをパラメーターと戻り値で報告します。 システム・ライブラリーに定義済みのサブルーチンは、 カーネルに対して行われたシステム・コールとまったく同じであるとは限りません。 truss コマンドはこれらのサブルーチンではなく、サブルーチンが行う基礎システム・コールを報告します。可能であれば、システム・コール・パラメーターが、関係のあるシステム・ヘッダー・ファイルの定義を使用してシンボルとして表示されます。パス名ポインターのパラメーターについては、truss は指し示されている文字列を表示します。 デフォルトでは、未定義のシステム・コールは、名前、8 つのすべての有効な引数、 16 進形式の戻り値と一緒に表示されます。

-o フラグを truss で使用する場合、 または標準エラーが非端末ファイルにリダイレクトされる場合は、 truss はハングアップ、割り込みおよびシグナルのプロセスを無視します。 これによって、端末から interrupt シグナルと quit シグナルを受け取る対話式プログラムのトレースが促進されます。

トレース出力が端末に送信され続ける場合や、 既存のプロセスがトレースされる (-p フラグを使用して) 場合は、 truss はすべてのトレースされているプロセスを解放して終了することによって、 hangupinterrupt、 および quit シグナルに応答します。 これによって、ユーザーは過度のトレース出力を終了させ、 以前に存在していたプロセスを解放できるようになります。 解放されたプロセスは通常に機能し続けます。

リスト引数を取るオプションの場合は、 リストの指定可能なすべてのメンバーを指定する簡略表現として名前 all を使用できます。 リストが ! で始まる場合は、 オプションの意味は否定されます (例えば、トレースではなく除外になる)。 同じオプションを複数回指定できます。 リスト中の同じ名前については、 後続のオプション (右側にあるオプション) が前のオプション (左側にあるオプション) をオーバーライドします。

ページ不在以外のマシン・フォールトが発生すると、 フォールトを引き起こしたプロセスにシグナルが送付されます。 受信されたシグナルの報告は、そのシグナルがプロセスによってブロックされていない限り、 マシン・フォールトの報告の直後に続きます。

他の制御プロセスとの衝突を避けるために、truss は、 検出したプロセスが /proc インターフェースを使用して別のプロセスによって制御されている場合は、 そのプロセスをトレースしません。

マルチプロセス用のトレース出力は、厳密な時間順に処理されるわけではありません。 例えば、パイプに対する読み取りは、対応する書き込みの前に報告されることがあります。 しかし、各プロセスについては、出力は厳密は時間順です。 トレース出力にはタブ文字が含まれていて、標準タブ停止位置は 8 つの位置ごとに設定されています。

システムは、子のトレース中にユーザーごとのプロセス・スロットを使い尽くすことがあります。 これは、複数のプロセスのトレース中は、truss が、 トレースされている各プロセス用の 1 つの制御プロセスとして実行され、 指定のプロセスに使用されているプロセス・スロットの数が倍になるためです。 マルチプロセスに対してトレースを実行する前に、 1 ユーザー当たり 25 のプロセスというシステムが課す通常の制限を考慮に入れる必要があります。

オペレーティング・システムは、プロセスのトレースに特定のセキュリティー制限を強制します。 トレースするコマンドへのアクセス権がなければなりません。 set-uid および set-gid プロセスは、 特権ユーザーだけがトレースできます。 truss コマンドは、特権ユーザーによって実行されない場合は、 set-id または読み取り不能なオブジェクト・ファイルを実行するプロセスの制御を失います。 これらのトレースされないプロセスは、実行時点から truss とは関係なく通常どおり継続します。

truss 出力に記載した lightweight processes (LWP) は、実際にはカーネル・ スレッドです。-l オプションを使用すると、トレース出力 の各行に LWP ID (つまりスレッド ID) を表示します。

AIX® ライブラリーのユーザー・ライブラリー機能には、静的にロードされた機能呼び出しと動的にロードされた機能呼び出しの両方があります。 トレース に -u オプションを付けると、動的にロードした機能 呼び出し専用に使用されます。

動的ロード機能呼び出しに対するユーザー・レベルの機能呼び出しに は、-u オプションがあります。このオプションを 使用すると、機能呼び出しの開始/終了トレースを生成します。

フラグ

項目 説明
-a 各実行システム・コールで渡されるパラメーター文字列を表示します。
-c トレース結果を 1 行ずつ表示するのではなく、 トレースされたシステム・コール、フォールト、シグナルをカウントします。 トレースされたコマンドの終了後、または truss に割り込みが生じた時に、 要約報告書が作成されます。 -f フラグも使用される場合は、 子プロセス用にカウントにはトレースされたすべての Syscall、フォールト、シグナルが含まれます。
-d それぞれの出力行には、タイム・スタンプが組み込まれます。 表示される時刻は、トレース開始からの秒数です。 トレース出力の最初の行には、 個別のタイム・スタンプの計測開始時刻となる基本時刻が表示されます。デフォルトでは、 タイム・スタンプは表示されません。
-D それぞれの出力行には、デルタ時間が表示されます。デルタ時間 は、LWP (スレッド) が引き起こした前回のイベントから今回のイベントまでの経過時間を示し ます。デフォルトでは、デルタ時間は表示されません。
-e 各実行システム・コールで渡される環境文字列を表示します。
-f fork システム・コールによって作成されたすべての子をトレースし、 子のシグナル、フォールト、システム・コールをトレース出力に含めます。 通常、第 1 レベルのコマンドまたはプロセスがトレースされます。 -f フラグを指定すると、 システム・コールを実行したプロセスまたはシグナルを受け取ったプロセスを表示する目的で、 プロセス ID がトレース出力の各行に組み込まれます。
-i 割り込み可能スリープ・システム・コールが表示されないようにします。 端末装置またはパイプに対する特定のシステム・コール (openkread など) は、 不定の期間に渡ってスリープ状態にすることができ、これらは割り込み可能です。 通常、truss は、システム・コールが 1 秒より長くスリープ状態になっている場合は、 このようなスリープ・システム・コールを報告します。 次いで、システム・コールは完了時にもう一度報告されます。 -i フラグを指定すると、 このようなシステム・コールが完了時に一度だけ報告されます。
-l 該当する LWP プロセスの ID (スレッド ID) と truss 出力を表示し ます。デフォルトでは、LWP ID は出力には表示されません。
-m [!] Fault プロセス内のマシン・フォールトをトレースします。トレースの対象とするマシン・ フォールトは、コンマで区切る必要があります。フォールトは、名前または番号で指定できます (sys/procfs.h 見出しファイルを参照)。リストが 「!」シンボルで始まる場合は、指定したフォールトがトレースの対象から 外されて、トレース出力には表示されません。デフォルトは、 -mall -m!fltpage です。
-o Outfile トレース出力に使用するファイルを指定します。 デフォルトでは、出力は標準エラーに行先指定されています。
-p truss に指定したパラメーターを、 実行するコマンドとしてではなく既存のプロセスのプロセス ID のリストとして解釈します。 プロセスのユーザー ID とグループ ID がユーザーのユーザー ID とグループ ID と一致する場合、またはユーザーが特権ユーザーである場合は、truss は各プロセスを制御してプロセスのトレースを開始します。
-r [!] FileDescriptor 指定した任意のファイル・ディスクリプターによる読み取りの入出力バッファーのすべての内容を表示します。 出力は 1 行当たり 32 バイトにフォーマットされ、 各バイトが ASCII 文字 (1 つのブランクが先頭にある) か、 水平タブ (¥t) や改行 (¥n) などの制御文字の場合は 2 文字の C 言語エスケープ・シーケンスで表示されます。 ASCII 変換処理が不可能な場合は、バイトは 2 文字の 16 進数表記で表示されます。 読み取られた各トレースの入出力バッファーの最初の 12 バイトは、 -r フラグを指定しない場合でも表示されます。 デフォルトは -r!all です。
-s [!] Signal トレースまたは除外する Signals のリスト表示を許可します。 リストに指定した (コンマで区切った) シグナルがトレースされます。 シグナルがプロセスによって無視されている (ただしブロックされていない) 場合でも、 トレース出力は指定した各シグナルの受信を報告します。 ブロックされたシグナルは、プロセスによって解放されるまで受信されません。 シグナルは名前と番号のどちらによっても指定できます (sys/signal.h を参照)。 リストが "!" シンボルで始まる場合は、 リストしたシグナルはトレース出力での表示から除外されます。 デフォルトは -s all です。
-t [!] Syscall システム・コールをトレース・プロセスに組み込んだりトレース・プロセスから除外します。 トレースするシステム・コールは、リストに指定してコンマで区切る必要があります。 リストが "!" シンボルで始まる場合は、 指定したシステム・コールはトレース出力から除外されます。 デフォルトは -tall です。
-u [!] [LibraryName [...]::[!]FunctionName [ ...] ]

ユーザー・ライブラリーから動的にロードしたユーザー・レベルの機能呼び出しを トレースします。LibraryName は、ライブラリー名をコン マで区切ったリストです。FunctionName は、機能名を コンマで区切ったリストです。どちらの場合も、名前には名前の突き合わせのメタキャラク ター (*?[]) を シェルによる解釈と同じ解釈で使用できますが、適用先はライブラリー/機能のネーム・スペースで、 ファイルではありません。

どちらのリストの場合も、! を先頭に付けると、 トレース対象から除外するライブラリーまたは機能の除外名前リストの指定になり ます。ライブラリーを除外すると、そのライブラリーのすべての機能が除外され ます。ライブラリー除外の後に続く機能リストは無視されます。複数 の -u オプションを指定すると、左から右の順序で 使用されます。デフォルトでは、ライブラリー/機能の呼び出しはトレースされません。

-w [!] FileDescriptor リストされている任意のファイル・ディスクリプターによる各書き込みの入出力バッファーの内容を表示します (-r を参照)。デフォルトは -w!all です。
-x [!] Syscall トレースされたシステム・コールの指定したパラメーターのデータを、 シンボルではなくロー・フォーマット (通常は 16 進数) で表示します。 デフォルトは -x!all です。

セキュリティー

RBAC ユーザーおよび Trusted AIX ユーザーへの注意: このコマンドは特権命令を実行できます。 特権命令を実行できるのは特権ユーザーのみです。 権限および特権についての詳細情報は、「セキュリティー 」の『特権コマンド・データベース』を参照してください。 このコマンドに関連した特権および権限のリストについては、lssecattr コマンドまたは getcmdattr サブコマンドの項を参照してください。

  1. 端末上の find コマンドのトレースを生成するには、次のようにタイプします。
    truss find . -print >find.out
  2. lseek、close、statx、open システム・コールをトレースするには、次のようにタイプします。
    truss -t lseek,close,statx,open find . -print > find.out
  3. find コマンドの通常の出力にスレッド ID を表示するには、 次のように入力します。
    truss -l find . -print >find.out 
  4. find コマンドの通常の出力にタイム・スタンプを表示するには、 次のように入力します。
    truss -d find . -print >find.out 
  5. find コマンドの通常の出力にデルタ時間を表示するには、 次のように入力します。
    truss -D find . -print >find.out 
  6. ls コマンドを実行したとき に、libc.a ライブラリーで malloc() 機能 呼び出しをトレースして、strlen() 機能呼び出しを除外する には、次のように入力します。
    truss -u libc.a::malloc,!strlen ls 
  7. ls コマンドを実行するときに、libc.a ライブラリー内で「m」で始まる名前のすべての機能呼び出しをトレースし、libc.a ライブラリー内の strlen() 機能呼び出しを除外するには、次のコマンドを入力します。
    truss -u libc.a::m*,!strlen ls 
  8. ls コマンドを実行し、libc.a ライ ブラリーで、「m」で始まる名前について、すべての機能呼び出しをトレースするには、 次のように入力します。
    truss -u libc.a::m* ls
  9. 実行可能な foo を実行して、libcurses.a ライ ブラリーのすべての機能呼び出しをトレースし、libc.a から の呼び出しを除外するには、次のように入力します。
    truss -u libcurses.a,!libc.a::* foo 
  10. 実行可能な foo を実行して、libcurses.a から の refresh() 機能呼び出しをトレース と、libc.a からの malloc() 機能 呼び出しをトレースするには、次のように入力します。
     truss -u libc.a::malloc -u libcurses.a::refresh foo

ファイル

/proc ファイルシステム