Linuxプログラムはに尋ねます
カーネル
彼らのためにいくつかのことをするために。 NS
ストレープ
コマンドはこれらのシステムコールを明らかにします。プログラムがどのように機能するのかを理解するためにそれらを使用することができます、そして時には彼らはそうではありません。
カーネルとシステム呼び出し
彼らがするかもしれないように、コンピュータプログラムは自分のためにすべてをすることができません。彼らはそれらのために実行された特定の機能を要求する必要があります。これらの要求はLinuxカーネルに行きます。通常、プログラムが呼び出すライブラリーまたは他のソフトウェア・インターフェース、およびライブラリは、適切な要求をシステム呼び出しからカーネルに呼び出します。
プログラムが作成したシステムと応答があなたが書いたプログラムの内部の働きを理解するのに役立つことができることをシステムに呼び出すことができることを確認できるようにすることができます。これは
何
ストレープ
NS
。問題をトラブルシューティングしてボトルネックを探すのに役立ちます。
これは同じではありません
アプリケーションのデバッグ
ツールのように
gdb.
。デバッグプログラムでは、実行中のプログラムの内部操作を調査できます。それはあなたのプログラムのロジックをステップ実行し、メモリと変数値を調べます。比較すると、何
ストレープ
プログラムが実行されているときにシステムコール情報をキャプチャします。トレースされたプログラムが終了すると、
ストレープ
システム呼び出し情報を端末ウィンドウにリストします。
システムコールは、ファイル上の読み取りと書き込みアクション、削除プロセスなどのすべての種類の低レベル機能を提供します。に何百ものシステムコールのリストがあります Syscalls Man Page. 。
関連している: GDBによるデバッグ:はじめに
ストラップの取り付け
もしも
ストレープ
コンピュータにはすでにインストールされていませんが、非常に簡単にインストールできます。
Ubuntuでは、このコマンドを使用してください。
SUDO APTインストールストレート
Fedoraで、このコマンドを入力します。
SUDO DNFインストールストレート
Manjaroでは、コマンドは次のとおりです。
SUDO PACMAN -SYストレープ
ストラップの最初のステップ
小さなプログラムを使って実証します
ストレープ
。それほど多くはありません:それはファイルを開き、それにテキストの行を書き込み、それにエラーチェックを持っていません。それは私たちに何かを持っているようにすばやくハックです
ストレープ
。
#include< stdio.h>
int main(int argc、char argv []){
//ファイルハンドル
ファイル* filegeek;
// "strace_demo.txt"というファイルを開くか、またはそれを作成する
fileGeek = fopen( "strace_demo.txt"、 "w");
//ファイルにテキストを書きます
fprintf(FileGeek、Filegeekファイルに書き込みます ");
//ファイルを閉じます
fclose(FileGeek);
//プログラムを終了します
戻る(0);
} //メインの終わり
これを「file-io.c」というファイルに保存し、それをコンパイルしました
GCC.
実行可能ファイルに
STEX
、 "
NS
人種
元
十分な。"
gcc -o stex file-io.c
電話します
ストレープ
コマンドラインから、トレースしたいプロセスとして、新しい実行可能ファイルの名前を渡します。 Linuxコマンドやその他のバイナリ実行可能ファイルのどちらかを簡単にトレースできます。私たちは2つの理由で私たちの小さなプログラムを使っています。
最初の理由はそれです
ストレープ
冗長です。多くの出力があります。使っているときそれは素晴らしいです
ストレープ
怒りでは、それは最初は圧倒的になることがあります。制限があります
ストレープ
私たちの小さなプログラムのための出力。 2番目の理由は、プログラムが機能性が限られており、ソースコードは短く直接的なものです。これにより、出力のどのセクションがプログラムの内部動作のさまざまな部分を参照するかを簡単に識別できます。
ストレート./stex
私たちは明確に見ることができます
書きます
システムコールテキストを「ファイルに書き込み」ファイルを開いたファイルと
exit_group.
システムコールこれにより、アプリケーション内のすべてのスレッドが終了し、戻り値をシェルに送り返します。
出力をフィルタリングする
私たちの単純なデモンストレーションプログラムでさえ、かなり多くの出力があります。私達はそれを使うことができます
の
(式)オプション。私たちが見たいシステム呼び出しの名前を渡します。
ストレープ-E write ./stex
それらをコンマ区切りリストとして追加することで、複数のシステムコールについて報告できます。システムコールのリストに空白スペースを含めないでください。
ストレート-E閉じる、書き込み./stex
出力をファイルに送信します
出力をフィルタリングすることの利点も、出力のフィルタリングに関する問題です。あなたはあなたが見たことを見たことがわかりますが、他には見えません。そして他の出力のいくつかはあなたが見たように頼んだものよりもあなたにとってより役に立つかもしれません。
時々、すべてを捉え、結果のセット全体を検索してスクロールするのが便利です。そのように、あなたは誤って重要なものを除外しません。 NS
-
(出力)オプションを使用すると、出力を送信できます。
ストレープ
テキストファイルへのセッション。
ストレート-o trace-output.txt ./stex
それからあなたはできます
使用
以下
指図
リストをスクロールし、システムコールを検索するには、または名前別のものを検索します。
trace-output.txt
あなたはすべてを使うことができます
以下
出力を調べるための検索機能。
関連している: Linuxでlessコマンドを使用する方法
タイムスタンプを追加する
出力に複数の異なるタイムスタンプを追加できます。 NS
-NS
(相対タイムスタンプ)オプションは、各連続システムコールの開始時の時間差を示すタイムスタンプを追加します。これらの時間値には、以前のシステムコールに費やされた時間と、次のシステムコールの前にプログラムが実行していたことのあるものが含まれます。
ストレープ-R ./stex
タイムスタンプは出力の各行の開始時に表示されます。
各システムコールに費やされた時間を確認するには、
-NS
(syscall-times)オプション。これは各システムコールの内側に費やされた時間の持続時間を示しています。
ストレープ-T ./stex
時間期間は各システムコールラインの最後に表示されます。
各システムコールが呼び出された時刻を確認するには、
~tt.
(絶対タイムスタンプ)オプション。これはマイクロ秒の解像度で「壁掛け時計」時間を示しています。
ストレープ-TT./stex
時間は各行の開始時に表示されます。
実行中のプロセスを追跡する
トレースするプロセスがすでに実行されている場合は、まだ添付できます。
ストレープ
それに。そうするためには、プロセスIDを知る必要があります。あなたはできる
使用する
ps
と
gr
これを見つけるために。 Firefoxが実行されています。のIDを見つけるために
Firefox.
プロセス、私たちは使うことができます
ps
と
それを通ってパイプします
gr
。
PS -E | GREP Firefox
プロセスIDが8483であることがわかります。
-NS
(プロセスID)
ストレープ
どのプロセスに取り付けるプロセス。使用する必要があることに注意してください
sudo.
:
SUDOストレート-P 8483
通知が表示されます
ストレープ
プロセスに自分自身を添付してから、通常どおりシステムトレース呼び出しが端末ウィンドウに表示されます。
レポートの作成
NS
-NS
(概要のみ)オプションの原因
ストレープ
レポートを印刷する。トレースされたプログラムによって作成されたシステムコールについての情報については、テーブルを生成します。
ストレート-C ./stex
列は次のとおりです。
- % 時間 :各システムコールに費やされた実行時間の割合。
- 秒数 :秒単位で表現された合計時間とマイクロ秒は、各システムコールに費やされました。
- USECS /コール :各システムコールに費やされたマイクロ秒の平均時間。
- 呼び出す :各システムコールが実行された回数。
- 誤差 :各システムコールの失敗数。
- sysc :システムコールの名前。
これらの値は、迅速に実行および終了する簡単なプログラムのゼロを表示します。実世界の値は、私たちのデモアプリケーションよりも意味があるプログラムのために表示されます。
深い洞察、簡単
NS
ストレープ
出力はどのシステムコールが行われているかを表示し、どのシステムが繰り返し行われています。それは素晴らしい情報です。多くの場合、コードの内側に何が起こっているのかを理解しようとしているときは、バイナリがカーネルでほぼノンストップに対話していることを忘れるのが簡単です。
使用することによって
ストレープ
、あなたは完全な絵を見ます。