ユーザーコマンド 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 オプションでは、すべてのシステムコールで渡すことができ る
あらゆる構造体を表示できるわけではありません。
|
|