これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド strace です。
プログラム:
NAME
strace - システムコールとシグナルをトレースします
SYNOPSIS
ストラス [-CdffhikqrtttTvVxxy] [-In] [-b実行する] [-e式] ... [-aの項目に表示されます。] [-ofile] [-sstrsize]
[-Ppath] ... -pピッド... / [-D] [-EVAR[=ヴァル]] ... [-uユーザ名] command [引数]
ストラス -c[df] [-In] [-b実行する] [-e式] ... [-Oオーバーヘッド] [-S並び替え] -pピッド... / [-D]
[-EVAR[=ヴァル]] ... [-uユーザ名] command [引数]
DESCRIPTION
最も単純なケースでは ストラス 指定されたものを実行します command 出るまで。 それはインターセプトし、
プロセスによって呼び出されるシステムコールと受信されるシグナルを記録します。
プロセスによって。 各システムコールの名前、引数、戻り値は次のとおりです。
標準エラーまたはコマンドで指定されたファイルに出力されます。 -o オプションを選択します。
ストラス は、便利な診断、指導、およびデバッグ ツールです。 システム管理者の皆様、
診断者やトラブルシューティング担当者にとって、問題を解決するのに非常に貴重であることがわかります。
ソースを入手する必要がないため、ソースがすぐに入手できないプログラム
それらを追跡するために再コンパイルされます。 学生、ハッカー、好奇心旺盛な人は、
システムとそのシステムコールについては、追跡することによって多くのことを学ぶことができます。
普通のプログラム。 そして、プログラマは、システム コールとシグナルが
ユーザー/カーネル インターフェイスで発生するイベントについては、この境界を詳しく調べる必要があります。
バグの分離、健全性チェック、競合状態の把握を試みる場合に非常に役立ちます。
トレースの各行にはシステム コール名が含まれ、その後にその引数が続きます。
括弧とその戻り値。 コマンド「cat /dev/null」をトレースした例
次のとおりです。
open("/dev/null", O_RDONLY) = 3
エラー (通常は戻り値 -1) には、errno 記号とエラー文字列が追加されます。
open("/foo/bar", O_RDONLY) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
信号は、信号シンボルとデコードされた siginfo 構造体として出力されます。 からの抜粋
コマンド「sleep 666」の追跡と中断は次のとおりです。
sigsuspend([]
--- SIGINT {si_signo=SIGINT、si_code=SI_USER、si_pid=...} ---
+++ SIGINT によって強制終了されました +++
システムコールが実行されている間に別のシステムコールが呼び出された場合、
別のスレッド/プロセス ストラス これらのイベントの順序を維持しようとします。
進行中の通話にマークを付ける 未完成の。 通話が返されると、次のようにマークされます。
再開.
[pid 28772] select(4, [3], NULL, NULL, NULL
[pid 28779] Clock_gettime(CLOCK_REALTIME, {1130322148, 939977000}) = 0
[pid 28772] <... 再開を選択> ) = 1 ([3] 内)
シグナル配信による (再開可能な) システム コールの中断は別の方法で処理されます。
カーネルはシステム コールを終了し、システム コールの直後の再実行も手配します。
シグナルハンドラが完了します。
read(0, 0x7ffff72cf5cf, 1) = ? ERESTARTSYS (再起動予定)
--- シガルム ... ---
rt_sigreturn(0xe) = 0
読み取り(0, "", 1) = 0
議論は情熱を持って象徴的な形で印刷されます。 この例はシェルを示しています
「>>xyzzy」出力リダイレクトを実行します。
open("xyzzy", O_WRONLY|O_APPEND|O_CREAT, 0666) = 3
ここで、open の XNUMX 番目の引数は、フラグ引数を分解してデコードされます。
XNUMX つのビットごとの OR 構成要素と、伝統的にモード値を XNUMX 進数で出力します。 どこ
従来のまたはネイティブな使用法は ANSI または POSIX とは異なり、後者の形式が推奨されます。
ある場合には、 ストラス 出力はソースよりも読みやすいことが証明されています。
構造体ポインターが逆参照され、メンバーが適切に表示されます。 全部で
case の引数は、可能な限り C に似た形式でフォーマットされます。 たとえば、
コマンド「ls -l /dev/null」の本質は次のようにキャプチャされます。
lstat("/dev/null", {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
「struct stat」引数がどのように逆参照され、各メンバーがどのように表示されるかに注目してください。
象徴的に。 特に、st_mode メンバーがどのように慎重にデコードされて
シンボリック値と数値のビットごとの OR。 この例では、最初の
lstat の引数はシステム コールへの入力であり、XNUMX 番目の引数は出力です。
システムコールが失敗しても出力引数は変更されないため、引数が常に有効であるとは限りません。
逆参照される。 たとえば、存在しないファイルを使用して「ls -l」の例を再試行します。
次の行が生成されます。
lstat("/foo/bar", 0xb004) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
この場合、ポーチのライトは点灯していますが、家に誰もいません。
文字ポインタは逆参照され、C 文字列として出力されます。 非印刷文字
文字列は通常、通常の C エスケープ コードで表されます。 最初だけ strsize (32
デフォルトでは)文字列のバイトが出力されます。 長い文字列には省略記号が追加されます
終わりの引用に続いて。 以下は「ls -l」からの行です。 getpwid ライブラリ
ルーチンはパスワード ファイルを読み取っています:
read(3, "root::0:0:システム管理者:/"..., 1024) = 422
構造体には中括弧を使用して注釈が付けられますが、単純なポインターと配列が出力されます。
要素をカンマで区切った角括弧を使用します。 以下はその例です。
補助的なグループ ID を持つシステム上のコマンド「id」:
getgroups(32, [100, 0]) = 2
一方、ビットセットも角括弧を使用して示されますが、セット要素は
スペースのみで区切られます。 外部コマンドを実行する準備をしているシェルは次のとおりです。
sigprocmask(SIG_BLOCK, [CHLD TTOU], []) = 0
ここで、XNUMX 番目の引数は、XNUMX つの信号 SIGCHLD と SIGTTOU のビットセットです。 ある場合には
ビットセットがいっぱいであるため、未設定の要素を出力する方が価値があります。 その中で
この場合、ビットセットには次のように先頭にチルダが付きます。
sigprocmask(SIG_UNBLOCK, ~[], NULL) = 0
ここで、XNUMX 番目の引数はすべての信号の完全なセットを表します。
OPTIONS
-c 各システム コールの時間、コール、エラーをカウントし、概要をレポートします。
プログラムを終了します。 Linux では、これはシステム時間 (CPU 消費時間) を表示しようとします。
カーネル内で実行されます)実時間とは独立しています。 もしも -c と一緒に使用されます -f
or -F (下記)、トレースされたすべてのプロセスの合計のみが保持されます。
-C いいね -c ただし、プロセスの実行中に通常の出力も出力します。
-D トレーサー プロセスを、トレーシーの親としてではなく、切り離された孫として実行します。
これにより、目に見える効果が減少します。 ストラス トレーシーを直接の子として保持することによって
呼び出しプロセスの。
-d のデバッグ出力を表示します ストラス それ自体は標準エラーに基づいています。
-f 現在トレースされているプロセスによって作成された子プロセスをトレースします。
の結果 フォーク(2) vフォーク(2)と (2) システムコール。 ご了承ください -p PID
-f マルチスレッドの場合、プロセス PID のすべてのスレッドをアタッチします。
thread_id = PID のスレッド。
-ff Status -o ファイル名 オプションが有効な場合、各プロセスのトレースは次の場所に書き込まれます。
ファイル名.pid ここで、pid は各プロセスの数値プロセス ID です。 これは
と互換性がありません -cプロセスごとのカウントは保持されないためです。
-F このオプションは現在廃止されており、次のオプションと同じ機能があります。 -f.
-h ヘルプの概要を印刷します。
-i システムコール時に命令ポインタを出力します。
-k 各システムコールの後に、トレースされたプロセスの実行スタックトレースを出力します。
(実験的)。 このオプションは次の場合にのみ使用できます。 ストラス で構築されています
リブンウィンド。
-q アタッチ、デタッチなどに関するメッセージを抑制します。これは自動的に行われます。
出力がファイルにリダイレクトされ、コマンドが直接実行される場合
取り付けます。
-qq XNUMX 回指定すると、プロセスの終了ステータスに関するメッセージが抑制されます。
-r 各システムコールの開始時に相対タイムスタンプを出力します。 これにより、
連続するシステムコールの開始間の時間差。
-t トレースの各行の先頭に時刻を付けます。
-tt XNUMX 回指定すると、印刷される時間にはマイクロ秒が含まれます。
-ttt XNUMX 回指定すると、出力される時間にはマイクロ秒と
先頭部分はエポックからの秒数として出力されます。
-T システムコールにかかった時間を表示します。 との時差を記録します。
各システムコールの開始と終了。
-w 各システムの開始と終了の時間差を要約します。
電話。 デフォルトでは、システム時刻が要約されます。
-v 環境、統計、termios などの呼び出しの短縮されていないバージョンを出力します。
これらの構造は呼び出しで非常に一般的であるため、デフォルトの動作が表示されます。
構造体メンバーの合理的なサブセット。 すべてを取得するには、このオプションを使用します。
悲惨な詳細。
-V のバージョン番号を印刷します ストラス.
-x すべての非 ASCII 文字列を XNUMX 進文字列形式で出力します。
-xx すべての文字列を XNUMX 進文字列形式で出力します。
-y ファイル記述子の引数に関連付けられたパスを出力します。
-yy ソケット ファイル記述子に関連付けられた ip:port ペアを出力します。
-a の項目に表示されます。 戻り値を特定の列 (デフォルトの列 40) に揃えます。
-b シスコール 指定されたシステムコールに到達した場合、トレースされたプロセスから切り離されます。 現在のところ、のみ
実行する システムコールがサポートされています。 このオプションは、トレースしたい場合に便利です。
マルチスレッドプロセスなので -f が必要ですが、そのプロセスをトレースしたくない
(潜在的に非常に複雑な)子供たち。
-e 式 トレースするイベントまたはトレース方法を変更する修飾式
彼ら。 式の形式は次のとおりです。
[資格=][!]value1[,value2] ...
コラボレー 資格 の一つである トレース, 略語, 詳細, 生, 信号, readまたは 書きます
値 修飾子に依存する記号または数値です。 デフォルトの修飾子は次のとおりです
トレース。 感嘆符を使用すると、一連の値が無効になります。 例えば、
-e 開いた 文字通りの意味 -e トレース=開いた これはつまり、 開いた
システムコール。 対照的に、 -e トレース=!開いた すべてのシステムコールをトレースすることを意味します
以下は除く 開いた。 さらに、特別な値 を なし 明らかなことを持っている
意味。
一部のシェルでは、履歴展開に感嘆符を使用することもあります。
引用符で囲まれた引数内。 その場合は、感嘆符をエスケープする必要があります。
バックスラッシュ。
-e トレース=セッションに
指定されたシステム コールのセットのみをトレースします。 の -c オプションは次の場合に便利です
どのシステム コールをトレースすると役立つかを判断します。 例えば、
トレース=開く、閉じる、読み取り、書き込み これら XNUMX つのシステム コールのみをトレースすることを意味します。 なれ
サブセットのみの場合、ユーザー/カーネル境界について推論するときは注意してください。
のシステムコールが監視されています。 デフォルトは トレース=を.
-e トレース=file
ファイル名を引数として受け取るすべてのシステム コールをトレースします。 考えることができます
これの略語として -e トレース=開いた,STAT,chmod,リンク解除、...つまり
プロセスがどのファイルを参照しているかを確認するのに役立ちます。 さらに、
省略形を使用すると、うっかり忘れてしまうことがなくなります。
のように電話する lstat リストにあります。 ベッチャはそれを忘れていただろう。
-e トレース=プロセス
プロセス管理に関係するすべてのシステム コールをトレースします。 これは次のような場合に便利です
プロセスのフォーク、待機、および実行のステップを監視します。
-e トレース=ネットワーク
すべてのネットワーク関連のシステム コールをトレースします。
-e トレース=信号
すべての信号関連のシステム コールをトレースします。
-e トレース=IPC
すべての IPC 関連のシステム コールをトレースします。
-e トレース=DESC
すべてのファイル記述子関連のシステム コールをトレースします。
-e トレース=っ
すべてのメモリ マッピング関連のシステム コールをトレースします。
-e 略語=セッションに
大きな構造体の各メンバーの出力を省略します。 の
デフォルトは 略語=をを選択します。 -v オプションには次のような効果があります 略語=なし.
-e 詳細=セッションに
指定されたシステム コールのセットの構造体を逆参照します。 デフォルトは
詳細=を.
-e 生=セッションに 指定されたシステムコールセットの生の、デコードされていない引数を出力します。 これ
このオプションには、すべての引数を XNUMX 進数で出力する効果があります。
これは、デコードが信頼できない場合、またはデコードを知る必要がある場合に主に役立ちます。
引数の実際の数値。
-e 信号=セッションに
信号の指定されたサブセットのみをトレースします。 デフォルトは 信号=を。 のために
例、 信号 =! シジオ (または 信号=!io) により、SIGIO 信号が送信されなくなります。
追跡した。
-e read=セッションに ファイルから読み取られたすべてのデータの完全な XNUMX 進数および ASCII ダンプを実行します。
指定されたセットにリストされている記述子。 たとえば、すべての入力を表示するには
ファイル記述子のアクティビティ 3 5 つかいます -e read=3,5。 これは、
通常のトレースから独立して、 read(2) システムコール
オプションで制御 -e トレース=read.
-e 書きます=セッションに
ファイルに書き込まれたすべてのデータの完全な XNUMX 進数および ASCII ダンプを実行します。
指定されたセットにリストされている記述子。 たとえば、すべての出力を表示するには
ファイル記述子のアクティビティ 3 5 つかいます -e 書きます=3,5。 これは、
通常のトレースから独立して、 書きます(2) システムコール
オプションで制御 -e トレース=書きます.
-I 割り込み可能
strace が信号 (^C を押すなど) によって中断される可能性がある場合。 1: いいえ
信号がブロックされます。 2: システムコールのデコード中に致命的な信号がブロックされる
(デフォルト); 3: 致命的な信号は常にブロックされます (「-o FILE PROG」の場合はデフォルト)。 4:
致命的なシグナルと SIGTSTP (^Z) は常にブロックされます (strace -o を作成するのに役立ちます)
FILE PROG が ^Z で停止しません)。
-o ファイル名 トレース出力をファイルに書き込みます ファイル名 標準エラーではなく。 使用
ファイル名.pid if -ff 使用されている。 引数が「|」で始まる場合または「!」 それから
引数の残りの部分はコマンドとして扱われ、すべての出力は次の場所にパイプされます。
それ。 これは、デバッグ出力をプログラムにパイプする際に便利です。
実行されたプログラムのリダイレクトに影響します。
-O オーバーヘッド システムコールをトレースするためのオーバーヘッドを次のように設定します。 オーバーヘッド マイクロ秒。 これは
所要時間を推測するためのデフォルトのヒューリスティックをオーバーライドするのに役立ちます。
を使用してシステムコールのタイミングを測定するだけで費やされる -c オプション。 ザ·
ヒューリスティックの精度は、指定されたプログラムの実行時間を計測することで測定できます。
トレース(使用) 時間(1)) の累積システムコール時間と比較します。
を使用して生産された合計 -c.
-p ピッド プロセス ID を使用してプロセスにアタッチします ピッド そしてトレースを開始します。 痕跡
キーボード割り込み信号 (CTRL-C) によっていつでも終了できます。 ストラス
トレースされたプロセスから自らを切り離し、プロセスを離れることで応答します。
走り続けるために。 多数 -p オプションを使用して多くの場所に取り付けることができます
プロセス。 -p "`pidof PROG`" 構文がサポートされています。
-P path システムコールのみをトレースしてアクセスする パス。 複数 -P オプションを使用して
複数のパスを指定します。
-s strsize 印刷する文字列の最大サイズを指定します (デフォルトは 32)。 ご了承ください
ファイル名は文字列とはみなされず、常に完全に出力されます。
-S 並び替え によって出力されたヒストグラムの出力を並べ替えます。 -c 指定されたオプション
基準。 有効な値は次のとおりです 時間, 呼び出し, 名, 何も (デフォルトは 時間).
-u ユーザ名 ユーザー ID、グループ ID、および補足グループを使用してコマンドを実行します。 ユーザ名.
このオプションは、root として実行している場合にのみ有効であり、正しいオプションを有効にします。
setuid および/または setgid バイナリの実行。 このオプションが使用されない限り、setuid
setgid プログラムは有効な特権なしで実行されます。
-E VAR=ヴァル でコマンドを実行します VAR=ヴァル 環境変数のリストにあります。
-E VAR 削除します VAR 渡す前に環境変数の継承されたリストから取得
コマンドに進みます。
診断
日時 command 出口、 ストラス 同じ終了ステータスで終了します。 もしも command によって終了します
信号、 ストラス 同じ信号で自分自身を終了するため、 ストラス はとして使用することができます
ラッパー プロセスは、呼び出し元の親プロセスに対して透過的です。 親子で注意してください
トレースされたプロセスと間の関係 (シグナル停止通知、getppid() 値など)
次の場合を除き、その親は保存されません。 -D 使用されている。
使用時 -p、の終了ステータス ストラス 予期しないエラーが発生しない限り、ゼロです。
トレースを行っています。
セットイド インストール
If ストラス setuid が root にインストールされている場合、呼び出し元のユーザーはアタッチできるようになり、
任意のユーザーが所有するプロセスを追跡します。 さらに、setuid および setgid プログラムは
適切な有効な権限で実行およびトレースされます。 信頼できるユーザーのみなので、
これらのことを行うには完全な root 権限を許可する必要があります。インストールすることだけが意味があります。
ストラス 実行できるユーザーがそのユーザーに制限されている場合は、setuid を root に設定します。
この信頼を持っている人。 たとえば、特別なバージョンの ストラス
モード「rwsr-xr--」、ユーザー ルート とグループ トレースのメンバーは、 トレース グループは
信頼できるユーザー。 この機能を使用する場合は、忘れずに非 setuid をインストールしてください。
のバージョン ストラス 一般のユーザーが使用するため。
onworks.net サービスを使用してオンラインで strace を使用する
