Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> straceを使用してLinuxサーバのトラブルシューティングをする

straceを使用してLinuxサーバのトラブルシューティングをする

  

straceはデフォルトでインストールされているほとんどのLinuxシステムで、プログラムがバックグラウンドで何をしているのかを追跡するためにシステムコールを追跡できます。 Straceは基本的なデバッグツールですが、問題を追跡していなくても素晴らしいソフトウェアです。 Linuxプログラムがどのように機能するのかについて多くのことを話すことができます。

システムコールはアプリケーションからカーネルへのメッセージです。現代のコンピュータシステムのユーザプログラムはサンドボックス内で実行されます。それらはコンピュータと直接対話することを許可しません(したがって、以前のようにいくつかのデータをレジスタに詰め込むことはできません)。代わりに、プログラムがシステムと対話する必要があるときはいつでも、それはカーネルに要求(システムコール)を送ります。 Straceはこれらのメッセージを追跡するために使用されます。ですから、しばらくの間straceの出力が表示されなくても、プログラムがブロックされているという意味ではありません。プログラムが、システムの他の部分と通信する必要がない独自のサンドボックス内で何かを実行する可能性は十分にあります。

使い方

Straceプログラムはこれらのことを行うことができますが、常にすべてを標準エラーファイル(つまり画面)に直接出力します。ご覧のとおり、大量の出力が生成されるので、通常は-oオプションを使用して出力ファイルを設定したほうがよいでしょう。

strace -o outputfile.txtプログラムにはいくつかのエディタがあります。 (例えばvim)straceの出力を構文ハイライトすることができます。これは、ファイルのさまざまな部分、および各行のさまざまな部分が異なる色で表示されることを意味します。この機能は非常に便利で、straceの出力を見るためにはこのようなエディタを使うことを強く勧めます。

コマンド出力の説明

strace -o strace.out lsを試してから、好きなエディタでstrace.outを開き、構文の強調表示を有効にします。

詳細に入る前に、各行の基本構造を見てみましょう。 Straceはプログラムによって行われたすべてのシステムコールを記録し、別々の行に表示されます。システムコールの名前は各行の先頭に表示され、パラメータは括弧内に表示されます。戻り値は等号の後、つまり行の末尾に表示されます。コマンドls - lの最初の数行は基本的に次のようになります。

execve(" /bin /ls"、[" ls"、" -l"]、[/* 21 Vars * /])= 0 brk(0)= 0x619000 mmap(NULL、4096、PROT_READ | 0 PROT_WRITE、MAP_PRIVATE | MAP_ANONYMOUS、-1、0)= 0x2b412f2b9000 uname({sys = "Linux"、node = "juliet.example.com"、...})= 0最初の行はexecveシステムコールを示します。パラメータは次のとおりです。現在の実行可能ファイルの場所(/bin /ls)コマンドラインから渡された引数の配列(lsおよび-l)21個の環境変数へのポインタもプログラムに渡されます。戻り値0は、正常に実行されたことを示します。これは、すべてのシステムコールが同じ基本構造です。背景の内側次の数行はメモリ管理に関連しています。 Brkはデータセグメントのサイズを変更し、mmapはプロセスに利用可能なメモリ位置を返すために使用されます。 (さらに情報が必要な場合は、man 2 mmapを試してください。)

次の行はシステムの詳細を表示するために使用されるunameシステムコールです。 Unameが返すものは、この情報を格納するデータ構造へのポインタです。システムコールはしばしばポインタを返します。これは、この情報を探す場所を指示するメモリ参照です。これはあなたがコンピュータであれば非常に便利ですが、あなたが人であれば必要ではありません;したがって、便宜上、__strace__がポインタを見つけるたびに自動的にそれを探してからその一部を返します。ポインターが指す内容。これはまさに上記のunameシステムコールで起こったことです。

straceの出力を見続けると、たくさんのアクセスとオープンコールが見られます。 Accessはファイルを探し(見つからなかった場合は-1を返し、エラーコードを返した場合)、現在のプログラムにアクセス権があるかどうかを確認します。 Openはファイルを開こうとし、それが成功するとファイルハンドル(STDIN、STDOUT、およびSTDERRには0から2が使用されるため、3から始まります)に接続してこのハンドルを返します。その後、fstatはハンドルに添付されたファイルに関する情報を取得します。ハンドルは、このように最初の引数を介して渡されます(2番目の引数はポインタです)。

fstat(3、 {st_mode = S_IFREG | 0644、st_size = 53482、...})= 0次のmmap呼び出しの後、ファイルは閉じられます。 lsの出力では、このシーケンスがライブラリファイルで何度も繰り返されていることがわかります。それ以降、リストされた各ファイルに対してlstat、lgetxattr、およびgetxattrが呼び出されます。これはすべて各ファイルの情報を取得するために使用されます。最後に、各ファイルはこのようにして出力ファイルに書き込まれます。stat(" /etc /localtime"、{st_mode = S_IFREG |} 0644、st_size = 3661、...})= 0 write(1、" -rw ------- 1 juliet juliet 10"、72)= 72 1と2の番号が付いたファイルハンドル( STDOUTとSTDERR)は閉じられるので、すべて完了です。

Copyright © Windowsの知識 All Rights Reserved