もっと詳しく

Linuxコマンドラインは、ソフトウェア開発者に役立つ多くのツールを提供します。 その中の1つは strace、このチュートリアルでは、わかりやすい例を使用して基本について説明します。

ただし、その前に、この記事のすべての例がUbuntu18.04LTSおよびDebian10マシンでテストされていることを言及する価値があります。

Linuxのstraceコマンドを使用すると、システムコールとシグナルをトレースできます。 その構文は次のとおりです。

strace [OPTIONS] command

そして、ツールのマニュアルページで説明されているのは次のとおりです。

       In  the simplest case strace runs the specified command until it exits.
       It intercepts and records the  system  calls  which  are  called  by  a
       process  and  the signals which are received by a process.  The name of
       each system call, its arguments and its return  value  are  printed  on
       standard error or to the file specified with the -o option.

strace is a useful diagnostic, instructional, and debugging tool.  Sys?
       tem administrators, diagnosticians and trouble-shooters  will  find  it
       invaluable  for  solving problems with programs for which the source is
       not readily available since they do not need to be recompiled in  order
       to trace them.  Students, hackers and the overly-curious will find that
       a great deal can be learned about a system  and  its  system  calls  by
       tracing  even  ordinary programs.  And programmers will find that since
       system calls and signals are events  that  happen  at  the  user/kernel
       interface,  a close examination of this boundary is very useful for bug
       isolation, sanity checking and attempting to capture race conditions.

以下は、straceコマンドがどのように機能するかをよりよく理解するためのQ&Aスタイルの例です。

straceコマンドのインストール

straceコマンドは、ほとんどのシステムにデフォルトでインストールされていません。DebianおよびUbuntuにインストールするには、次のコマンドを実行します。

sudo apt-get install strace

Q1。 straceコマンドの使い方は?

基本的な使い方は簡単で、コマンドを入力として「strace」を実行するだけです。 たとえば、lsコマンドで使用しました。

strace ls

そして、これが私のシステムで生成された出力です:

Q2。 strace出力を理解する方法は?

前のセクションのスクリーンショットでわかるように、straceコマンドは大量の出力を生成します。 したがって、それを理解する方法を知っておく必要があります。

マニュアルページからの次の抜粋は、要点を説明しています。

       Each line in the trace contains the system call name, followed  by  its
       arguments  in parentheses and its return value.  An example from strac?
       ing the command "cat /dev/null" is:

           open("/dev/null", O_RDONLY) = 3

       Errors (typically a return value of -1) have the errno symbol and error
       string appended.

           open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory)

       Signals are printed as signal symbol and decoded siginfo structure.  An
       excerpt from stracing and interrupting the command "sleep 666" is:

           sigsuspend([] <unfinished ...>
           --- SIGINT {si_signo=SIGINT, si_code=SI_USER, si_pid=...} ---
           +++ killed by SIGINT +++

Q3。 strace印刷命令ポインタを作成するにはどうすればよいですか?

システムコール時に命令ポインタを出力するようにstraceに指示するオプション-iがあります。

例えば:

strace -i ls

出力は次のとおりです。

strace印刷命令ポインタの作り方

したがって、出力の各行に命令ポインタが出力されていることがわかります。

Q4。 各システムコールのstrace印刷タイムスタンプを作成するにはどうすればよいですか?

各システムコールへのエントリ時に相対タイムスタンプを表示するようにstraceに指示する-rコマンドラインオプションがあります。 ツールのマニュアルページには、連続するシステムコールの開始間の時間差が記録されていると記載されています。

例えば:

strace -r ls

このコマンドによって生成される出力は次のとおりです。

各システムコールのstrace印刷タイムスタンプを作成する方法

したがって、相対タイムスタンプがすべての行の先頭に生成されたことがわかります。

Q5。 各出力行の前にクロック時間を付けるにはどうすればよいですか?

strace出力の各行をクロック時間で開始する場合は、-tコマンドラインオプションを使用してこれを実行できます。

例えば:

strace -t ls

これが私のシステムでのこのコマンドの出力です:

Strace時間プレフィックス

したがって、各行の先頭にシステム時刻が出力されていることがわかります。

straceが提供する関連オプションがさらに2つあることに注意してください。

-tt         
If given twice, the time printed will include the microseconds.

-ttt       
If given thrice, the  time  printed  will  include  the microseconds and the leading portion will
be printed as the number of seconds since the epoch.

Q6。 システムコールに費やされた時間をstraceに表示させる方法は?

これは、-Tコマンドラインオプションを使用して実現できます。

例えば:

strace -T ls

出力は次のとおりです。

straceで関数呼び出しのタイミングを表示する

したがって、システムコールに費やされた時間が各行の終わりに印刷されていることがわかります。

Q7。 straceに通常の出力の代わりに要約を出力させる方法は?

ツールで要約を生成する場合は、-cコマンドライン出力を使用できます。

たとえば、次のコマンド:

strace -c ls

私のシステムでこの出力を生成しました:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 93.66    0.000133           5        28           write
  6.34    0.000009           1        11           close
  0.00    0.000000           0         7           read
  0.00    0.000000           0        10           fstat
  0.00    0.000000           0        17           mmap
  0.00    0.000000           0        12           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         2           ioctl
  0.00    0.000000           0         8         8 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         2           getdents
  0.00    0.000000           0         2         2 statfs
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         9           openat
  0.00    0.000000           0         1           set_robust_list
  0.00    0.000000           0         1           prlimit64
------ ----------- ----------- --------- --------- ----------------
100.00    0.000142                   120        10 total

したがって、要約を見ると、syscallごとに行われた呼び出しの数と、各syscallの時間関連情報がわかります。

結論

straceコマンドは他にも多くの機能を提供するため、ここで表面をかじったところです。 ここで説明したことをすべて練習したら、 straceのマニュアルページ ツールの詳細については、こちらをご覧ください。

The post 初心者向けのLinuxstraceコマンドチュートリアル(8例) appeared first on Gamingsym Japan.