strace-ltrace について
strace-ltrace は、プログラムの動作を調べるエージェント向けトレーススキルです。strace でシステムコールを、ltrace でライブラリ呼び出しを追跡し、OS とのやり取りの問題を診断します。
主な機能
- 01システムコールとライブラリ呼び出しの追跡
- 02ファイルやネットワークなどによる絞り込み
- 03一般的なエラーコードの解釈
- 04タイムスタンプと呼び出し時間の確認
- 05ファイル、ネットワーク、ロード障害の調査手順
活用シーン
- 01プログラムが開こうとするファイルの特定
- 02ネットワーク接続問題の調査
- 03ファイル不足や権限エラーの分析
- 04動的ライブラリのロードや seccomp 障害の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill strace-ltraceインストール後、Claude Code で/strace-ltraceを入力して読み込まれたか確認します。
同梱ファイルreferences/strace-patterns.md
詳細
strace / ltrace
目的
クラッシュやデバッガーを使わずに、誤ったバイナリの動作を診断する最も効果的なツールである strace でシステムコールを、ltrace でライブラリ呼び出しをトレースする方法をエージェントに案内します。
トリガー
- 「プログラムの動作がおかしいのですが、何をしているかトレースするにはどうすればよいですか?」
- 「バイナリがどのファイルを開いているか調べるにはどうすればよいですか?」
- 「strace に ENOENT と表示されます。どう解釈すればよいですか?」
- 「strace でネットワーク呼び出しをトレースするにはどうすればよいですか?」
- 「ltrace とは何ですか?strace とはどう違いますか?」
- 「実行中のプロセスをトレースするにはどうすればよいですか?」
ワークフロー
1. strace の基本的な使い方
# Trace all syscalls of a command
strace ./myapp arg1 arg2
# Attach to running process
strace -p 12345
# Trace child processes too (-f = follow fork)
strace -f ./myapp
# Save to file (raw output — not stdout)
strace ./myapp 2> trace.txt
# Most useful: timestamps + summary
strace -t -f ./myapp 2>&1 | head -100
2. システムコールのカテゴリで絞り込む
# Trace file operations only
strace -e trace=file ./myapp
# Trace network syscalls
strace -e trace=network ./myapp
# Trace specific syscalls
strace -e trace=open,openat,read,write ./myapp
# Trace process management
strace -e trace=process ./myapp
# Trace memory operations
strace -e trace=memory ./myapp
# Trace signals
strace -e trace=signal ./myapp
# Multiple categories
strace -e trace=file,network ./myapp
| カテゴリ | 含まれるシステムコール |
|---|---|
file | open、openat、stat、access、unlink、rename、... |
network | socket、connect、bind、accept、send、recv、... |
process | fork、exec、wait、clone、exit、... |
memory | mmap、munmap、mprotect、brk、... |
signal | kill、sigaction、sigprocmask、... |
ipc | pipe、socket pair、shmget、... |
desc | close、dup、poll、select、epoll、... |
3. よくあるエラーの解釈
# See return values and errors
strace -e trace=file ./myapp 2>&1 | grep -E "ENOENT|EPERM|EACCES|ENOTSUP"
| エラー | 意味 | よくある原因 |
|---|---|---|
ENOENT | ファイルまたはディレクトリがありません | 設定ファイルがない、パスが間違っている |
EACCES | アクセスが拒否されました | ファイルのアクセス権、SELinux |
EPERM | 操作が許可されていません | 必要なケイパビリティがない、suid が必要 |
EADDRINUSE | アドレスはすでに使用中です | ポートがすでにバインドされている |
ETIMEDOUT | 接続がタイムアウトしました | ネットワークに到達できない、ファイアウォール |
ECONNREFUSED | 接続が拒否されました | サーバーがリッスンしていない |
EAGAIN | リソースを一時的に利用できません | ノンブロッキング I/O、再試行が必要 |
ENOMEM | メモリが不足しています | メモリ割り当てに失敗した |
EBADF | ファイルディスクリプターが不正です | 閉じられた、または無効な fd を使用している |
ENOEXEC | 実行形式エラーです | アーキテクチャに対応しないバイナリ形式 |
# Find what file is not found
strace ./myapp 2>&1 | grep 'ENOENT'
# Example output:
# openat(AT_FDCWD, "/etc/myapp.conf", O_RDONLY) = -1 ENOENT (No such file or directory)
# → Config file expected at /etc/myapp.conf
4. 便利な strace フラグ
# Show strings fully (default truncates at 32 chars)
strace -s 256 ./myapp
# Timestamps
strace -t ./myapp # wall clock time
strace -T ./myapp # time spent in each syscall
strace -r ./myapp # relative timestamps
# System call count summary
strace -c ./myapp
# Shows count, time, errors per syscall — great for profiling
# Trace with PIDs in output (for -f)
strace -f -p ./myapp
# Output: [pid 12346] open("/etc/passwd", O_RDONLY) = 3
# Decode numerical arguments
strace -e verbose=all ./myapp
# Print instruction pointer at each syscall
strace -i ./myapp
5. ltrace — ライブラリ呼び出しのトレース
# Trace all library calls
ltrace ./myapp
# Trace specific library function
ltrace -e malloc,free,fopen ./myapp
# Trace nested calls (lib → lib)
ltrace -n 2 ./myapp # indent nested calls
# Trace with syscalls too
ltrace -S ./myapp
# Attach to running process
ltrace -p 12345
# Summary statistics
ltrace -c ./myapp
ltrace の一般的な出力:
malloc(1024) = 0x55a1b2c3d000
fopen("/etc/myapp.conf", "r") = 0
free(0x55a1b2c3d000) = <void>
strace と ltrace の比較:
| strace | ltrace | |
|---|---|---|
| トレース対象 | カーネルのシステムコール | ユーザー空間のライブラリ呼び出し |
| オーバーヘッド | 低い | 高い(PLT フック) |
| 表示内容 | open()、read()、write() | fopen()、malloc()、printf() |
| 使用する場面 | バイナリが OS/ファイル/ネットワークとやり取りする場合 | バイナリが、確認できないライブラリ関数を呼び出す場合 |
6. 実践的な診断ワークフロー
# Find missing config file
strace -e trace=openat,open ./myapp 2>&1 | grep ENOENT
# Find what network connections are made
strace -e trace=network -f ./myapp 2>&1 | grep connect
# Debug dynamic library loading failures
strace -e trace=openat ./myapp 2>&1 | grep "\.so"
# Find permission issues
strace -e trace=file ./myapp 2>&1 | grep -E "EACCES|EPERM"
# Debug slow startup (find where time is spent)
strace -c ./myapp 2>&1
# Look for high % time in unexpected syscalls
# Watch IPC/shared memory
strace -e trace=ipc,shm ./myapp
# Find what the binary exec's
strace -e trace=execve -f ./myapp
7. seccomp フィルターのデバッグ
プログラムが seccomp ポリシーによって強制終了される場合、strace でそれを引き起こしたシステムコールを確認できます。
strace -e trace=all ./myapp 2>&1 | tail -5
# Often shows the last syscall before SIGSYS
strace の出力パターンと ltrace のフィルタリング例については、references/strace-patterns.md を参照してください。
関連スキル
- strace で失敗箇所がわかり、内部を調べる必要がある場合は、
skills/debuggers/gdbを使用します - バイナリが使用するライブラリとシンボルを把握するには、
skills/binaries/elf-inspectionを使用します LD_*やライブラリの読み込みに関する問題を診断するには、skills/binaries/dynamic-linkingを使用します- パフォーマンスをプロファイリングするには、
skills/profilers/linux-perfを使用します(strace のオーバーヘッドはパフォーマンス測定には高すぎます)
コメント
Markdown 対応