10.2. ltrace の使用
分析するプログラムで ltrace
ユーティリティーを実行するには、次のコマンドを実行します。
$ scl enable devtoolset-9 'ltrace program
argument...'
program を、分析するプログラムの名前に置き換え、argument を、このプログラムに指定するコマンドラインオプションと引数に置き換えます。以下の例では、-p
コマンドラインオプションとプロセス ID を使用して、実行中のプロセスでユーティリティーを実行できます。
$ scl enable devtoolset-9 'ltrace -p process_id
'
この scl
ユーティリティーを使用してコマンドを実行すると、これを Red Hat Enterprise Linux システムに優先して使用する Red Hat Developer Toolset バイナリーで実行することができることに注意してください。これにより、デフォルトで Red Hat Developer Toolset ltrace
でシェルセッションを実行できます。
$ scl enable devtoolset-9 '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-9 'ltrace -o file_name
program argument...'
file_name をファイル名に置き換えます。
例10.1 出力のファイルへのリダイレクト
例8.1「デバッグ情報を使用した C プログラムのコンパイル」 から fibonacci
ファイルのバージョンを若干変更したことを検討してください。この実行可能ファイルには、Fibonacci シーケンスが表示され、オプションでこのシーケンスのメンバー数を指定することができます。このファイルで ltrace
ユーティリティーを実行し、トレース出力を fibonacci.log
リダイレクトします。
$ scl enable devtoolset-9 '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-9 'ltrace -e expression
program argument...'
expression をルールチェーンに置き換え、トレースするライブラリー呼び出しを指定します。ルールは、シンボル名 (malloc
または free
など) と、ライブラリー SONAME (libc.so
など) を識別するパターンで構成されています。たとえば、malloc
および free
関数への呼び出しを追跡し、libc
ライブラリーが実行したものを省略するには、以下のコマンドを実行します。
$ scl enable devtoolset-9 'ltrace -e malloc+free-@libc.so* program'
例10.2 選択したライブラリー呼び出しの追跡
ls
コマンドを考慮します。このプログラムで ltrace
ユーティリティーを実行、opendir
、readdir
、および closedir
関数呼び出しのみを追跡します。
$ scl enable devtoolset-9 '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-9 'ltrace -t program
argument...'
ミリ秒を表示するには、-t
オプションを 2 回指定します。
$ scl enable devtoolset-9 'ltrace -tt program
argument...'
トレースの各行を、各システムコールの実行に必要な時間にプレフィックスを付けるには、-r
コマンドラインオプションを使用します。
$ scl enable devtoolset-9 'ltrace -r program
argument...'
例10.3 タイムスタンプの表示
pwd
コマンドを考慮します。このプログラムで ltrace
ユーティリティーを実行し、出力にタイムスタンプを含めます。
$ scl enable devtoolset-9 '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-9 'ltrace -c program
argument...'
例10.4 サマリーの表示
lsblk
コマンドを考慮します。このプログラムで ltrace
ユーティリティーを実行し、トレースの概要を表示します。
$ scl enable devtoolset-9 '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