Linux

  
でのstraceコマンドの使用に関する詳細な説明

straceコマンドは、ユーザースペースプログラムによって発行されたすべてのシステムコールを表示する強力なツールです。

straceはこれらの呼び出しのパラメータを表示し、その値を記号形式で返します。 Straceはカーネルから情報を受け取り、特別な方法でカーネルを構築する必要はありません。

次のレコードは、いくつかの一般的なオプションです。

1 -f -Fオプションは、straceにforkとvforkの進行状況を追跡するよう指示します。

2 -o xxx.txtドキュメント

3 -eはexecveのみ記録はexecveこのようなシステムは
を呼び出す

—————————————————

プロセスを開始することはできません、ソフトウェアが急に速度を実行しているプログラム&'、鈍化;ので、Unixシステムは、それぞれのユーザ頭痛ように、

; SegmentFault&'この記事では、一般的に使用されている3つのデバッグツールtruss、strace、およびltraceを使用して、3つの実用的なケースを通してソフトウェアの「困難」を迅速に診断する方法を説明します。



システムコールまたはプロセスのシグナル生成を追跡するために、トラスとstraceが使用されます。一方、プロセス呼び出しライブラリ関数を追跡するために、ltraceが使用されます。早期のSystem V R4としてトラスほとんどのUnixシステムでは、このツールが付属していますを含むAIX、FreeBSDの、などのデバッガを開発、元々のSunOSシステムのために書かれ

straceの、ltraceのは、最初に登場しましたGNU /DebianLinux。

これら2つのツールは現在ほとんどのUnixシステムに移植されていますが、ほとんどのLinuxディストリビューションにはstraceとltraceが付属しています。


コマンドラインから新しいプログラムをデバッグできるだけでなく、実行中のプログラムをデバッグするために、トラス、strace、またはltraceを既存のPIDにバインドすることもできます。ずっと同じ基本的な使用3つのデバッグ・ツール、ここにしかない3つがあり、そして3つが最も一般的に使用されるコマンドラインパラメータです:


-f:現在のプロセスを追跡することに加え、その子プロセスも追跡します。

-o file:出力を標準エラー出力(stderr)に表示するのではなく、ファイルfileに書き込みます。

-p pid:pidに対応する実行中のプロセスにバインドします。このパラメータはバックグラウンドプロセスをデバッグするためによく使用されます。


ほとんどのデバッグ作業は、上記の3つのパラメーターを使用して実行できます。コマンドラインの例をいくつか示します。

truss -o ls.truss ls - Al:ls -alの実行をトレースし、出力をファイル/tmp/ls.trussに書き込みます。

strace -f -o vim.strace vim:vimとその子プロセスの操作をトレースし、その出力をファイルvim.straceに書き込みます。

ltrace -p 234:すでに実行中のプロセスをpid 234で追跡します。


3つの出力フォーマットのデバッグツールは、実施例と非常に類似しているstraceの:


BRK(0)= 0&回; 8062aa8 < BR>

BRK(0&回; 8063000)= 0&回; 8063000

mmap2(NULL、4096、PROT_READ、MAP_PRIVATE、3,0&回; 92F)= 0&回; 40016000


各行はシステムコールです。等号の左側はシステムとそのパラメータによって呼び出される関数の名前、右側はコールの戻り値です。トラス、straceのとltraceのは、ずっと同じ働き、ptraceのシステムを使用して追跡通話を試運転の過程にある、詳細な原理は、この資料の範囲内ではない、そのソースコードを参照することができます興味を持っています。

2つの例を挙げて、これら3つのデバッグツールを使用してソフトウェアを診断する方法を示します。


オペレーティングシステム
:FreeBSD-5.2.1-release

clintは、Ports経由でインストールされるC ++静的ソースコード解析ツールです。実行:


#クリントfoo.cpp

セグメンテーションフォールトが(コアダンプ)

Unixシステム&'に会った;セグメンテーションフォールト'のようにMS Windows
のポップアップ「不正な操作」ダイアログボックスも同じように迷惑です。クリントにトラスを使用します。





#尾clint.truss

739:(0回、6,0&回; 806f000,0&回; 1000)を読ん= 4096(0回、1000)

739:FSTAT(6,0xbfbfe4d0 )= 0(0回、0)

739:fcntlの(0回、6,0&回; 3,0&回; 0)= 4(0&回; 4)

739:fcntlの(0回、6 、0時間; 4,0&回; 0)0(0時間= 0)

739:近い(6)= 0(0回、0)

739:STAT(' /ルート/.clint /プラグ', 0xbfbfe680)ERR#2‘そのようなファイルまたはディレクトリ’

信号11
信号11は

はプロセスのための停止

16

process exit、rval = 139

clintのシステムコールの実行を追跡して結果をファイルclint.trussに出力するためにtrussを使用し、最後の数行を表示するためにtailを使用します。 ERR#2‘そのようなファイルやディレクトリ’、問題;(/root/.clint/plugins', 0xbfbfe680&')STAT:
は、

最後のシステムコール(下から5行目)のクリントの実行に注意してくださいここから:clintはディレクトリ' /root/.clint/plugins'を見つけることができず、セグメンテーションエラーが発生しました。解決するには?非常に単純です。mkdir-p /root/.clint/pluginsですが、今度はclin​​tを実行しても「> Segmentation Fault」になります。トラストラックを使用し続け、クリントもディレクトリ&'を見つける必要がある。/root/.clint/plugins/python&'後;、通常の動作にでき、最終的にこのディレクトリのクリントを構築しました。


ケース2:vimの起動速度がかなり遅い


オペレーティングシステム:FreeBSD-5.2.1-release

vimバージョンは6.2.154で、コマンドラインからvimを実行してから編集インターフェイスに入るまでに約30分かかり、エラー出力はありません。 .vimrcとすべてのvimスクリプトが誤って設定されていないこと、およびインターネット上の同様の問題に対する解決策がないことを慎重にチェックしてください。問題を見つけるためにtrussを使用する必要はありません。


#truss -f -D -o vim.truss vim


here-Dこのパラメータの目的は、各出力行の前に相対タイムスタンプを追加することです。これは、システムコールの実行にかかる時間です。限り、我々はシステムコールがそれに長い時間を費やしたかに焦点を当てるよう、より少ない慎重で出力ファイルvim.trussを見て、すぐに間違いを見つけた:


735:0.000021511ソケット(0回; 2,0&回; 1,0&回; 0)= 4(0&回; 4)

735:0.000014248のsetsockopt(0時間; 4,0&回; 6,0&回; 1,0xbfbfe3c8,0&回; 4)= 0( 0× 0)

Copyright © Windowsの知識 All Rights Reserved