技術ノート Linux strace を使用してシステム コールとシグナルをトレースする方法

strace を使用してシステム コールとシグナルをトレースする方法

strace を使用してシステム コールとシグナルをトレースする方法

コンピューター プログラムのトレースは、ソース コードを持っていて、それを読み取ることができ、デバッガーの使用方法を知っている人だけが行うことができるわけではありません。 Linux ユーザーは誰でも strace を使用して実行可能ファイルをトレースできます。方法を見つけます!

ステレース とは何ですか?

strace を使用してシステム コールとシグナルをトレースする方法

strace は、特定のアプリケーションが行うシステム コールをトレースできる Linux ユーティリティです。また、信号を検出し、観測したすべての情報の詳細な出力を生成します。

一般に、strace と tracing を初めて使用する人は、これがなぜ役立つのか疑問に思うかもしれません。プロの IT エンジニアは、特に GDB のようなデバッガからどれだけの情報を確認できるかを知っている場合、strace が実際にどれだけの情報を収集できるかを尋ねるかもしれません。

コンピューター コードとプログラムのデバッグに興味がある場合は、 「GDB を使用したデバッグ: 入門」の 記事を参照してください。

どちらの場合にも朗報です!すべてのシステム コールとシグナルをトレースすると、プログラムの動作の包括的な全体像が得られ、トラブルシューティングやデバッグにも優れたツールとなります。さらに、ランタイム中に (ラッパー プロセスとして) 実行されますが、ログファイルに簡単にトレースでき、プログラムのアクションの概要を理解しやすくなります。

これを同じくラッパー プロセスである GDB と比較すると、状況が大幅に異なります。たとえば、GDB では、プログラムを段階的にトレースできます (たとえば、一度に 1 行のコードまたはコードの論理ブロック、またはコード内のブレークポイントを使用)。ただし、そのようなステップは実行 時に 行われますが、strace はエラーが発生するか完了するまでプログラム全体を実行するだけです。

その後、エンジニアまたはユーザーは、完全な (テキストベースの) ログを分析したり、興味深い文字列を検索したりできます。さらに、GDB を使用すると、シグナルやシステム コールも確認できますが、その設定と分析ははるかに複雑です。 strace よりも複雑です。

strace を使用すると、 strace の下でプログラムを単純に実行できます (つまり、

 strace some_program

) であり、これは GDB とほぼ同じですが、前述のように操作が大きく異なります。

トレースから確認できる情報の量については、一歩下がって、ディスクがいっぱいである、メモリが使い果たされている、ファイルが見つからない、入力が間違っているなど、コンピュータの問題のほとんどがどこから発生しているのかを思い出してみるとよいでしょう。

特にディスクアクセスの分野では、 strace が真価を発揮します。すべてのシステムコールを記録するため、すべてのディスクアクセスがログではっきりと確認できます。この場合も、関連するテキスト文字列とファイル名を検索できます。ただし、場合によっては文字列の長さが短縮され、部分的な出力のみが表示される可能性があることに注意してください。

要約すると、 strace デバッグおよび/またはトラブルシューティング ツールとして評価し、新しいまたはより熟練した Linux ユーザー ツールボックスに割り当てる必要がある場合、どちらの場合も、答えは、少し傾いているものの、 ほぼ中間 です。デバッグよりもトラブルシューティングに重点を置いています。次に strace をインストールしましょう。

strace を使用してシステム コールとシグナルをトレースする方法

strace の インストール

Debian/Apt ベースの Linux ディストリビューション (Ubuntu や Mint など) に strace をインストールするには、ターミナルで次のコマンドを実行します。

 sudo apt install strace

RedHat/Yum ベースの Linux ディストリビューション (RHEL、Centos、Fedora など) に strace をインストールするには、ターミナルで次のコマンドを実行します。

 sudo yum install strace
strace を使用してシステム コールとシグナルをトレースする方法

straceの 使用

strace をインストールした後は、非常に簡単に始めることができます。たとえば、Linux を追跡できます。

 sleep

コマンド/ユーティリティ:

ステイススリープ1

出力は、上記のステートメントをすぐに証明します。 (非常に) 単純な sleep 1 コマンドによって実行されるすべてのアクションに関する情報が大量にありますが、結局のところ、このコマンドは 1 秒間スリープするアクションだけです。

すぐに観察できることをいくつか見てみましょう。

 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)

開始直後に、プログラムが (ディスク上の) ファイル /etc/ld.so.preload にアクセスしようとしたことがわかります。また、ファイルが見つからなかった ( ENOENT ) ため、これが失敗した ( -1 status ) こともわかります No such file or directory ) という説明的なエラー メッセージが表示されます。

この 1 行の出力だけでも、さらなる研究につながる可能性があります。たとえば、お気に入りの検索エンジンをスキャンして、ファイル /etc/ld.so.preload が何であるか、プログラムがそれを見つけられない場合に何が起こるか、またそのインストール方法を調べることができます。

ご覧のとおり、より複雑なソフトウェア/プログラムを strace で実行すると、共有 .so ライブラリなどのファイルにアクセスしようとして、それが見つからない場合があります。これは strace のおかげで簡単に分析でき、おそらく簡単に修正できます。

次に、close-on-exec フラグ (競合状態を回避するためにマルチスレッド プログラムで使用される) O_CLOEXEC フラグが設定され、 conf.d バイナリ キャッシュが 読み取り専用 ( O_RDONLY ) として正常に開かれていることを確認します。

 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3

それぞれの項目の意味が分からない場合でも、オンラインで簡単に検索すると、それぞれの特定の用語や単語に関する情報がすぐに得られ、提示された情報と何が起こっているのかを理解するのに役立ちます。

また、特に興味深いのは、最後の部分にある次の行です。

 +++ は 0 で終了しました +++

これは、プログラムが終了コード 0 で正常に終了したことを示します。終了コード 0 は通常、Linux プログラムの実行と終了が成功したことを示します。

上記の例からわかるように、 strace 使用すると、プログラムが何を行っているかを簡単に確認できます。各行、さらには各行内の各単語さえも分析でき、多くの場合、何らかの光を当てるために検索エンジンが必要になります。ただし、失敗したプログラムの出力をざっと確認するだけでも、正確な原因を見つけて修正するには十分な場合があります。たとえば、必要なファイルが見つからない場合などは特にそうです。

strace を使用してシステム コールとシグナルをトレースする方法

子プロセスのトレース

strace を使用する場合、 strace プログラムのすべてのシステム コールなどを正しくトレースしていないように見えることがあります。これは単に、トレースされているプログラムが、たとえば子プロセスをフォークすることによって、多数の子プロセスを開始/開始したことが原因である可能性があります。

これらの子プロセスを strace キャプチャに含めるのは簡単です。 -f オプションをコマンド ラインに追加するだけで (つまり、 strace -f your_program )、すべての子プロセスのすべてのシステム コールなども追跡されます。

strace を使用してシステム コールとシグナルをトレースする方法

まとめ

この記事では、Linux ベースのコンピューター上で実行されているプログラムやアプリケーションのトレースを作成するために使用できる strace ツールについて説明しました。

ツールをインストールした後、 strace の下でプログラムを簡単かつ直接起動し、 strace ラッパーが提供する高レベルのトラブルシューティングおよびデバッグ情報を活用することができます。

「 strace を使用してシステム コールとシグナルをトレースする方法」に関するベスト動画選定!

【#58 CCNA 】【4章 VLAN】VTP ドメイン 3つのモード サーバモード クライントモード トランスペアレントモード
その2: カーネルとシステムコール