システムコールと信号をトレースするためのstraceの使い方
コンピュータープログラムのトレースは、ソースコードを持ち、それを読み、デバッガを使いこなすことができる人だけに限定されているわけではありません。どんなLinuxユーザーでもstraceを使用して実行可能ファイルをトレースできます。やり方を見つけましょう!
strace とは何ですか?
straceは、特定のアプリケーションが行うシステムコールをトレースするLinuxのユーティリティです。また、シグナルを把握し、観測したすべての情報の詳細な出力を生成します。
straceやトレースに不慣れな人は、なぜこれが役立つのかと尋ねるかもしれません。一方で、プロのITエンジニアは、特にGDBのようなデバッガーからどれだけの情報がちらっと見えるかを知っている場合、straceが実際にどれだけの情報を取得できるのかと尋ねるかもしれません。
コンピュータコードやプログラムのデバッグに興味があるなら、私たちの「GDBによるデバッグ:始めに」をご覧ください。
両方のケースで良いニュースがあります!すべてのシステムコールと信号を追跡することで、プログラムの動作の包括的な画像が提供され、優れたトラブルシューティングツールやデバッグツールになります。さらに、ランタイム中に(ラッパープロセスとして)実行されますが、簡単にログファイルに追跡することができ、プログラムの動作を理解しやすい概要にします。
これをラッパープロセスでもあるGDBと比較すると、状況は大きく異なります。たとえば、GDBではプログラムをステップバイステップで追跡することができます(例えば、1行ずつコードを追う、または論理ブロックを追う、またはコード内のブレークポイントを使用することができます)。しかし、そのようなステップは実行時に行われるのに対し、straceは単にプログラム全体を実行し続け、エラーが発生するか、完了するまで待ちます。
エンジニアまたはユーザーは、その後、完全な(テキストベースの)ログを分析し、興味深い文字列を検索することができます。さらに、GDBを使用すれば、信号やシステムコールも見ることができますが、それを設定して分析するのはstraceよりもはるかに複雑です。
straceを使用すると、プログラムをstraceの下で簡単に実行できます(つまり、
strace some_program)、これはGDBとほぼ同じですが、上記で説明したように操作は大きく異なります。
痕跡から得られる情報の量については、ほとんどのコンピュータの問題がどこから来るのか、つまりディスクの容量不足、メモリの枯渇、ファイルが見つからない、誤った入力などを思い出して、一歩引いて考えることが重要です。
特にディスクアクセスの分野において、straceは本当に優れています。すべてのシステムコールを記録するため、すべてのディスクアクセスがログに非常に見えやすくなっています。再度、関連するテキスト文字列やファイル名を検索できますが、場合によっては文字列が短縮されることがあるため、一部の出力しか表示されない可能性があることに注意してください。
要約すると、もし strace をデバッグおよび/またはトラブルシューティングツールとして評価し、新しいまたはより熟練したLinuxユーザーのツールボックスに位置づける必要があるなら、どちらの場合でも答えは大体真ん中であり、デバッグよりもトラブルシューティングに少し傾いています。次に strace をインストールしましょう。
straceのインストール
Debian/AptベースのLinuxディストリビューション(UbuntuやMintなど)にstraceをインストールするには、ターミナルで以下のコマンドを実行してください:
sudo apt install stracestraceをRedHat/YumベースのLinuxディストリビューション(RHEL、Centos、Fedoraなど)にインストールするには、ターミナルで以下のコマンドを実行してください:
sudo yum install stracestraceを使用して
straceをインストールした後、始めるのは非常に簡単です。例えば、Linuxをトレースすることができます。
sleepコマンド/ユーティリティ:
strace sleep 1
すぐに、その出力は上記の文を証明します。結局のところ、非常にシンプルな sleep 1 コマンドによって行われるすべてのアクションに関する膨大な情報があります。このコマンドは、単に1秒間待機するだけです。
まず、私たちがすぐに観察できるいくつかのことを見てみましょう:
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
プログラムが開始してからすぐに、ディスク上のファイル /etc/ld.so.preload にアクセスしようとしたことがわかります。また、ファイルが見つからなかったため(ENOENT)、この操作は失敗しました(-1 ステータス)し、エラーメッセージは No such file or directory となっています。
この単一の出力行だけでも、さらなる研究につながる可能性があります。たとえば、私たちのお気に入りの検索エンジンで、ファイル/etc/ld.so.preloadが何であるか、何をするのか、プログラムがそれを見つけられないときに何が起こるのか、またそれをどのようにインストールできるのかを調べることができます。
ご覧のように、もしより複雑なソフトウェア/プログラムをstraceで実行すると、ファイル-例えば共有.soライブラリ-にアクセスしようとしているのに、それを見つけられないことがわかるかもしれません。straceのおかげで、この問題は簡単に分析でき、修正も容易です。
次に、conf.d バイナリキャッシュが 読み取り専用 (O_RDONLY) として正常にオープンされ、マルチスレッドプログラムで競合状態を避けるために使用される実行時クローズフラグ O_CLOEXEC フラグが設定されたことがわかります。
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
たとえ各項目が何を意味するのか知らなくても、オンラインで簡単に検索すれば、各特定の用語や言葉についての情報をすぐに得ることができ、提示された情報や起こっていることを理解するのに役立ちます。
特に興味深いのは、この文章の終わりにあるこの行です:
+++ exited with 0 +++
これは、プログラムが終了コード0で正常に終了したことを示しています。終了コード0は、一般的にLinuxプログラムにおける成功した実行と終了を示します。
上記の例からもわかるように、straceを使用するとプログラムが何をしているかを簡単に見ることができます。各行、さらには各行の各単語も分析可能であり、しばしば検索エンジンが必要になります。しかし、失敗しているプログラムの出力にざっと目を通すだけでも、正確な原因を見つけて修正するのに十分なことがあります。特に、たとえば必要なファイルが欠落している場合などはなおさらです。
子プロセスのトレース
straceを使用しているとき、straceがプログラムのすべてのシステムコールなどを正しくトレースしていないように見えることがあります。これは、トレースされているプログラムが、たとえば、子プロセスをフォークすることによって、いくつかの子プロセスを開始しているためかもしれません。
これらの子プロセスをstraceキャプチャに含めるのは簡単です:コマンドラインに-fオプションを追加するだけです(つまり、strace -f your_program)、すべての子プロセスのすべてのシステムコールなども追跡されます。
まとめる
この記事では、Linuxベースのコンピュータ上で実行されているプログラムやアプリケーションのトレースを作成するために使用できるstraceツールについて説明しました。
ツールをインストールした後、私たちは単純に直接straceのもとでプログラムを開始し、straceラッパーが提供する高レベルのトラブルシューティングおよびデバッグ情報を楽しむことができます。

