Linux ltrace コマンド
ltrace は Linux システムのユーティリティであり、プログラムの実行時に呼び出される動的ライブラリ関数をトレースして記録します。これはプログラムの動作をデバッグ・分析するための強力なツールで、特に以下のようなシナリオに適しています:
- プログラムがどのライブラリ関数を呼び出したかを確認する
- 関数呼び出しの引数と戻り値を理解する
- プログラムとライブラリ関数の相互作用の問題を診断する
- プログラムのパフォーマンスボトルネックを分析する
strace コマンド(システムコールのトレース)とは異なり、ltrace はユーザー空間のライブラリ関数呼び出しに焦点を当てています。
ltrace のインストール
ほとんどの Linux ディストリビューションではデフォルトで ltrace がインストールされていません。パッケージマネージャを使用してインストールできます:
実例
sudo apt-get install ltrace
# CentOS/RHEL
sudo yum install ltrace
# Fedora
sudo dnf install ltrace
# Arch Linux
sudo pacman -S ltrace
基本構文
ltrace の基本コマンド形式は次のとおりです:
ltrace [选项] 要跟踪的程序 [程序参数]
または実行中のプロセスにアタッチします:
ltrace -p PID
よく使うオプションとパラメータ
| オプション | 説明 |
|---|---|
-c |
関数呼び出しの回数と時間を統計し、最後に集計情報を出力します |
-e |
指定した関数のみをトレースします(ワイルドカード対応) |
-f |
子プロセスをトレースします |
-i |
命令ポインタ(IP)を出力します |
-l |
指定したライブラリ内の関数のみをトレースします |
-n |
出力行のインデントレベルを指定します |
-o |
出力をファイルに書き込みます |
-p |
実行中のプロセスにアタッチします |
-r |
相対タイムスタンプを出力します |
-S |
システムコールも同時にトレースします |
-t |
各行の先頭に時刻を追加します |
-T |
各呼び出しの所要時間を表示します |
-u |
指定したユーザーとして実行します |
使用例
基本的なトレース例
簡単なプログラムのライブラリ関数呼び出しをトレースします:
ltrace ./my_program
出力例:
printf("Hello, World!n") = 13
malloc(1024) = 0x55a1a2e2e260
free(0x55a1a2e2e260) =
関数呼び出しの統計
使用する-cオプションで関数呼び出しの統計情報を取得します:
ltrace -c ./my_program
出力例:
% time seconds usecs/call calls function ------ ----------- ----------- --------- -------------------- 45.23 0.123456 123 1000 malloc 32.12 0.087654 87 1000 free 22.65 0.061728 61 1000 printf
特定の関数をトレース
トレースするのはmallocとfree関数のみ:
ltrace -e "malloc,free" ./my_program
実行中のプロセスにアタッチ
PID 1234 のプロセスをトレースします:
ltrace -p 1234
呼び出しの所要時間を表示
使用する-Tオプションで各呼び出しの所要時間を表示します:
ltrace -T ./my_program
出力例:
malloc(1024) = 0x55a1a2e2e260 free(0x55a1a2e2e260) =
実際の応用例
例1:メモリ割り当ての分析
ltrace -e "malloc,free" ./memory_intensive_program
このコマンドを使用すると、プログラムのメモリ割り当てと解放のパターンを確認でき、メモリリークや過剰な割り当ての問題を発見するのに役立ちます。
例2:ネットワークプログラムのデバッグ
ltrace -e "connect,send,recv" ./network_program
これにより、ネットワークプログラムがソケットとどのようにやり取りするかを理解し、接続パラメータやデータ転送の状況を確認できます。
例3:パフォーマンス分析
ltrace -c -T ./performance_critical_program
組み合わせる-cと-Tオプションを使用すると、プログラム内で最も時間がかかるライブラリ関数呼び出しを見つけることができます。
上級テクニック
1. 出力のフィルタリング
grep を使用して ltrace の出力をフィルタリングします:
ltrace ./my_program 2>&1 | grep "interesting_function"
2. システムコールの同時トレース
使用する-Sオプションでシステムコールとライブラリ関数を同時にトレースします:
ltrace -S ./my_program
3. 出力形式のカスタマイズ
使用する-nインデントを制御し、-tタイムスタンプを追加します:
ltrace -n 2 -ttt ./my_program
4. 特定のライブラリのトレース
libcrypto ライブラリ内の関数のみをトレースします:
ltrace -l libcrypto.so ./my_program
よくある質問と回答
Q1: ltrace と strace の違いは何ですか?
- ltrace はライブラリ関数呼び出しをトレースします
- strace はシステムコールをトレースします
- 通常は最初に ltrace で分析し、より低レベルの情報が必要な場合は strace を使用します
Q2: 一部のプログラムで ltrace が機能しないのはなぜですか?
考えられる原因:
- プログラムが静的リンクされている(動的ライブラリに依存していない)
- プログラムが ltrace でトレースできない技術を使用している(直接システムコールなど)
- 権限が不足している(sudo を試してください)
Q3: C++ プログラムをトレースするにはどうすればよいですか?
C++ の関数名はマングリング(mangled)されます。使用できるのは、-Cオプションでデコードを試みることです:
ltrace -C ./cpp_program
または c++filt ツールを使用して出力をデコードします。
ベストプラクティス
- シンプルに始める:まず基本コマンドで全体像を確認し、その後徐々にオプションを追加します
- 他のツールと組み合わせる:ltrace を gdb、valgrind などのツールと併用します
- パフォーマンスへの影響に注意:ltrace はプログラムの速度を著しく低下させるため、本番環境には適していません
- 出力を記録する:使用する
-oオプションで出力をファイルに保存して分析しやすくします - コンテキストを理解する:ソースコードと組み合わせて関数呼び出しの関係を理解します
まとめ
ltrace は Linux 開発者のツールボックスに欠かせないツールであり、プログラムの実行時動作を観察する独自の視点を提供します。ltrace を習得することで、次のことが可能になります:
- プログラムがライブラリとどのように連携するかをより深く理解できる
- パフォーマンスのボトルネックを迅速に特定できる
- 再現が難しい実行時問題を診断できる
- 優れたオープンソースプロジェクトの実装方法を学べる
読者は自分のプロジェクトで ltrace のさまざまな使い方を実践し、この強力なデバッグツールを段階的に習得することをお勧めします。
その他の拡張
Linux コマンド大全