10.2. ltrace の使用

分析するプログラムで ltrace ユーティリティーを実行するには、次のコマンドを実行します。

$ scl enable devtoolset-12 'ltrace program argument...'

program を、分析するプログラムの名前に置き換え、argument を、このプログラムに指定するコマンドラインオプションと引数に置き換えます。以下の例では、-p コマンドラインオプションとプロセス ID を使用して、実行中のプロセスでユーティリティーを実行できます。

$ scl enable devtoolset-12 'ltrace -p process_id'

この scl ユーティリティーを使用してコマンドを実行すると、これを Red Hat Enterprise Linux システムに優先して使用する Red Hat Developer Toolset バイナリーで実行することができることに注意してください。これにより、デフォルトで Red Hat Developer Toolset ltrace でシェルセッションを実行できます。

$ scl enable devtoolset-12 'bash'
注記

任意の時点で使用している ltrace のバージョンを確認するには、以下のコマンドを実行します。

$ which ltrace

Red Hat Developer Toolset の ltrace 実行可能なパスは、/opt で始まります。以下のコマンドを使用して、バージョン番号が Red Hat Developer Toolset ltrace と一致することを確認することができます。

$ ltrace -V

10.2.1. 出力のファイルへのリダイレクト

デフォルトでは ltrace、各システムコールの名前、引数、および戻り値を標準エラー出力に出力します。この出力をファイルにリダイレクトするには、-o コマンドラインオプションの後にファイル名を指定します。

$ scl enable devtoolset-12 'ltrace -o file_name program argument...'

file_name をファイル名に置き換えます。

例10.1 出力のファイルへのリダイレクト

例8.1「デバッグ情報を使用した C プログラムのコンパイル」 から fibonacci ファイルのバージョンを若干変更したことを検討してください。この実行可能ファイルには、Fibonacci シーケンスが表示され、オプションでこのシーケンスのメンバー数を指定することができます。のファイルで ltrace ユーティリティーを実行し、トレース出力を fibonacci.log にリダイレクトします。

$ scl enable devtoolset-12 'ltrace -o fibonacci.log ./fibonacci 20'
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

これにより、現在の作業ディレクトリーに、fibonacci.log という新しいプレーンテキストファイルが作成されます。

10.2.2. 選択したライブラリー呼び出しの追跡

選択したライブラリーコールのセットのみを追跡するには、-e コマンドラインオプションを指定して ltrace ユーティリティーを実行します。

$ scl enable devtoolset-12 'ltrace -e expression program argument...'

expression をルールチェーンに置き換え、トレースするライブラリー呼び出しを指定します。ルールは、シンボル名 (malloc または free など) と、ライブラリー SONAME (libc.so など) を識別するパターンで設定されています。たとえば、malloc および free 関数への呼び出しを追跡し、libc ライブラリーが実行したものを省略するには、以下のコマンドを実行します。

$ scl enable devtoolset-12 'ltrace -e malloc+free-@libc.so* program'

例10.2 選択したライブラリー呼び出しの追跡

ls コマンドを考慮します。このプログラムで ltrace ユーティリティーを実行し、opendirreaddir、および closedir 関数呼び出しでのみトレースします。

$ scl enable devtoolset-12 'ltrace -e opendir+readdir+closedir ls'
ls->opendir(".")     = { 3 }
ls->readdir({ 3 })   = { 61533, "." }
ls->readdir({ 3 })   = { 131, ".." }
ls->readdir({ 3 })   = { 67185100, "BUILDROOT" }
ls->readdir({ 3 })   = { 202390772, "SOURCES" }
ls->readdir({ 3 })   = { 60249, "SPECS" }
ls->readdir({ 3 })   = { 67130110, "BUILD" }
ls->readdir({ 3 })   = { 136599168, "RPMS" }
ls->readdir({ 3 })   = { 202383274, "SRPMS" }
ls->readdir({ 3 })   = nil
ls->closedir({ 3 })  = 0
BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS
+++ exited (status 0) +++

利用可能なフィルター式の詳細は、ltrace(1) man ページを参照してください。

10.2.3. タイムスタンプの表示

トレースの各行を、時間、分、および秒で正確な時刻に接頭辞するには、-t コマンドラインオプションを指定して ltrace ユーティリティーを実行します。

$ scl enable devtoolset-12 'ltrace -t program argument...'

ミリ秒を表示するには、-t オプションを 2 回指定します。

$ scl enable devtoolset-12 'ltrace -tt program argument...'

トレースの各行を、各システムコールの実行に必要な時間に接頭辞を付けるには、-r コマンドラインオプションを使用します。

$ scl enable devtoolset-12 'ltrace -r program argument...'

例10.3 タイムスタンプの表示

pwd コマンドを考慮します。このプログラムで ltrace ユーティリティーを実行し、出力にタイムスタンプを含めます。

$ scl enable devtoolset-12 'ltrace -tt pwd'
13:27:19.631371 __libc_start_main([ "pwd" ] <unfinished ...>
13:27:19.632240 getenv("POSIXLY_CORRECT")                        = nil
13:27:19.632520 strrchr("pwd", '/')                              = nil
13:27:19.632786 setlocale(LC_ALL, "")                            = "en_US.UTF-8"
13:27:19.633220 bindtextdomain("coreutils", "/usr/share/locale") = "/usr/share/locale"
13:27:19.633471 textdomain("coreutils")                          = "coreutils"
(...)
13:27:19.637110  exited (status 0)

10.2.4. サマリーの表示

各システムコールの実行に必要な時間と、これらのシステムコールを実行した回数の概要を表示するには、-c コマンドラインオプションを指定して ltrace ユーティリティーを実行します。

$ scl enable devtoolset-12 'ltrace -c program argument...'

例10.4 サマリーの表示

lsblk コマンドについて考えてみましょう。このプログラムで ltrace ユーティリティーを実行し、トレースの概要を表示します。

$ scl enable devtoolset-12 'ltrace -c lsblk > /dev/null'
% time     seconds  usecs/call     calls      function
------ ----------- ----------- --------- --------------------
 53.60    0.261644      261644         1 __libc_start_main
  4.48    0.021848          58       374 mbrtowc
  4.41    0.021524          57       374 wcwidth
  4.39    0.021409          57       374 __ctype_get_mb_cur_max
  4.38    0.021359          57       374 iswprint
  4.06    0.019838          74       266 readdir64
  3.21    0.015652          69       224 strlen
...
------ ----------- ----------- --------- --------------------
100.00    0.488135                  3482 total