## はじめに
Linuxにはシステムコールトレース、関数呼び出し追跡、メモリ解析、パケットキャプチャまで、多彩なデバッグツールが用意されています。それぞれの得意分野を知り、状況に応じて使い分けることが、トラブルシューティング力を高めるカギです。
本記事では、現場でよく使う主要デバッグツールを目的別に整理し、基本的な使い方を実例付きで紹介します。
## 症状・背景
– プロセスがハングしている原因を調べたい
– ライブラリ関数の呼び出しを追跡したい
– アプリケーションのパフォーマンスボトルネックを特定したい
– 通信が成功しているかパケットレベルで確認したい
## 手順・設定方法
### ステップ1: straceでシステムコール追跡
“`bash
# プロセスのシステムコールを追跡
strace -p $(pgrep nginx | head -1)
# プログラムを起動して追跡
strace -o output.txt ./myapp
# 特定のシステムコールだけ
strace -e trace=open,read,write ./myapp
# 統計情報モード
strace -c ./myapp
“`
### ステップ2: ltraceとgdbで関数追跡
“`bash
# ライブラリ関数呼び出し追跡
ltrace -p $(pgrep myapp)
# gdbでアタッチしてバックトレース取得
sudo gdb -p $(pgrep myapp)
(gdb) bt
(gdb) detach
# coreファイルから解析
gdb ./myapp core
“`
### ステップ3: perfでCPUプロファイル
“`bash
# 全体のCPU使用率プロファイル
sudo perf top
# 特定プロセスで10秒間記録
sudo perf record -p $(pgrep nginx) — sleep 10
# 結果を表示
sudo perf report
# ホットなシステムコールを確認
sudo perf stat -e syscalls:sys_enter_* ./myapp
“`
### ステップ4: tcpdumpとssでネットワーク調査
“`bash
# 特定ポートのパケットを取得
sudo tcpdump -i eth0 -nn port 80 -w capture.pcap
# HTTPリクエストの中身を表示
sudo tcpdump -i any -A ‘tcp port 80’
# 接続中のソケット一覧
ss -tnp
# リッスン中のポート
ss -tlnp
“`
## 注意事項
– straceはオーバーヘッドが大きく、本番環境では一時的な使用に留めます
– gdbでアタッチ中はプロセスが停止するため、影響範囲を考慮します
– perfにはカーネルのデバッグシンボル(debuginfo)が必要な場合があります
– tcpdumpは大量のパケットを生成しがちなのでフィルタで絞り込みます
## まとめ
1. **strace**: システムコールを追跡し、I/O問題やハングを調査
2. **gdb/ltrace**: アプリ内部の関数呼び出しを解析
3. **perf**: CPUのホットスポットをプロファイル
4. **tcpdump/ss**: ネットワーク通信を可視化
5. **使い分け**: 症状に応じて最適なツールを選択
関連記事:
– [Linuxでコマンドの実行時間を計測する方法](/articles/linux-command-time-measure)
– [Linuxでディスク障害を検出するS.M.A.R.T.確認方法](/articles/linux-smart-disk-health)
– [Linuxのkernelparam・カーネルパラメータをsysctlで設定する方法](/articles/linux-sysctl-kernel-params)





