Linux ltrace コマンド

Linux 命令大全Linux コマンド大全


ltrace は Linux システムのユーティリティであり、プログラムの実行時に呼び出される動的ライブラリ関数をトレースして記録します。これはプログラムの動作をデバッグ・分析するための強力なツールで、特に以下のようなシナリオに適しています:

  • プログラムがどのライブラリ関数を呼び出したかを確認する
  • 関数呼び出しの引数と戻り値を理解する
  • プログラムとライブラリ関数の相互作用の問題を診断する
  • プログラムのパフォーマンスボトルネックを分析する

strace コマンド(システムコールのトレース)とは異なり、ltrace はユーザー空間のライブラリ関数呼び出しに焦点を当てています。


ltrace のインストール

ほとんどの Linux ディストリビューションではデフォルトで ltrace がインストールされていません。パッケージマネージャを使用してインストールできます:

実例

# Debian/Ubuntu
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 が機能しないのはなぜですか?

考えられる原因:

  1. プログラムが静的リンクされている(動的ライブラリに依存していない)
  2. プログラムが ltrace でトレースできない技術を使用している(直接システムコールなど)
  3. 権限が不足している(sudo を試してください)

Q3: C++ プログラムをトレースするにはどうすればよいですか?

C++ の関数名はマングリング(mangled)されます。使用できるのは、-Cオプションでデコードを試みることです:

ltrace -C ./cpp_program

または c++filt ツールを使用して出力をデコードします。


ベストプラクティス

  1. シンプルに始める:まず基本コマンドで全体像を確認し、その後徐々にオプションを追加します
  2. 他のツールと組み合わせる:ltrace を gdb、valgrind などのツールと併用します
  3. パフォーマンスへの影響に注意:ltrace はプログラムの速度を著しく低下させるため、本番環境には適していません
  4. 出力を記録する:使用する-oオプションで出力をファイルに保存して分析しやすくします
  5. コンテキストを理解する:ソースコードと組み合わせて関数呼び出しの関係を理解します

まとめ

ltrace は Linux 開発者のツールボックスに欠かせないツールであり、プログラムの実行時動作を観察する独自の視点を提供します。ltrace を習得することで、次のことが可能になります:

  • プログラムがライブラリとどのように連携するかをより深く理解できる
  • パフォーマンスのボトルネックを迅速に特定できる
  • 再現が難しい実行時問題を診断できる
  • 優れたオープンソースプロジェクトの実装方法を学べる

読者は自分のプロジェクトで ltrace のさまざまな使い方を実践し、この強力なデバッグツールを段階的に習得することをお勧めします。


Linux 命令大全Linux コマンド大全

その他の拡張