これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの 64 つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド straceXNUMX です。
プログラム:
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 では、後者の形式が推奨されます。 ある場合には、
ストラス 出力はソースよりも読みやすいことが証明されています。
構造体ポインターが逆参照され、メンバーは次のように表示されます。
適切な。 すべての場合において、引数は最も 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
一方、ビットセットも角括弧を使用して示されますが、
set 要素はスペースでのみ区切られます。 こちらがシェルです
外部コマンドを実行する準備をしています。
sigprocmask(SIG_BLOCK, [CHLD TTOU], []) = 0
ここで、XNUMX 番目の引数は、SIGCHLD と XNUMX つの信号のビットセットです。
シットトウ。 場合によっては、ビットセットがいっぱいになり、
設定されていない要素の方が価値があります。 その場合、ビットセットは接頭辞として付加されます。
次のようなチルダで区切ります。
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 権限を持つ信頼されたユーザーには、これらの実行を許可する必要があります。
インストールするだけで意味がある ストラス root への setuid として
実行できるユーザーがそのユーザーに限定されている場合
この信頼を持っている人。 たとえば、
の特別バージョン ストラス モード「rwsr-xr--」、ユーザー ルート
グループヘッド トレースのメンバーは、 トレース グループは信頼できるユーザーです。
この機能を使用する場合は、必ず非対応のソフトウェアをインストールしてください。
のsetuidバージョン ストラス 一般のユーザーが使用するため。
onworks.net サービスを使用してオンラインで strace64 を使用する
