このページの目次
ftrace と bpftrace によるユーザーランドトレース
カバー範囲: uprobe → USDT (DTraceプローブ) → bpftrace ユーザーランドスクリプト → perf probe (ユーザーランド) → ユーザーランド動的トレースの全体像 対象: Linux + bpftrace/bcc/perf
uprobe: ユーザーランド関数プローブ
# uprobe: 任意のユーザーランド関数のエントリ/リターンにプローブポイントを配置
# 構文: uprobe:<バイナリ>:<関数>
# 例: bash の readline をトレース:
# → bash が readline を呼び出すたびに記録される
# 引数付き:
# cmd: 関数リターン後の第1引数 (ARMでは %si=x0、x86では %rdi)
# uretprobe: 関数リターン時に実行
USDT: 事前に埋め込まれた静的プローブポイント
// USDT (User Statically Defined Tracing): DTraceプローブに類似
// コンパイル時に埋め込まれ、実行時はオーバヘッドゼロ (NOP) → 有効化されるまで
;
// → NOPスレッドとしてコンパイルされ、実行時に uprobe によって INT3 ブレークポイントに置換される
// バイナリ内の USDT 埋め込みを確認:
bpftrace -l 'usdt:/path/to/binary:*'
readelf -n /path/to/binary | grep NT_STAPSDT
bpftrace: ユーザーランドトレース
# 1行でトレース:
# ヒストグラム:
# 統計:
# プロセス別:
# 関数の実行時間をトレース:
# open 呼び出しをトレース (ファイル名付き):
bcc ユーザーランドツール
# bcc: Python + BPF の高レベルラッパー
# コンパイル済みツール ( /usr/share/bcc/tools/ に配置):
# 用途: BPF プログラムを書かずに、プリコンパイル済みツールを直接使用可能
カーネルトレースとの組み合わせ
# ユーザーランドからカーネルランドまでの完全なチェーン:
デバッグテクニック
# バイナリ内でプローブ可能な関数を探す:
| | |
# インストール済みの uprobe を確認:
# perf プローブポイントを確認:
# クリーンアップ:
参考
- ツール: bpftrace (github.com/bpftrace), bcc (github.com/iovisor/bcc)
- ドキュメント:
man perf-probe, Brendan Gregg のブログ - LWN: 「Uprobes and USDT」、「Dynamic tracing with bpftrace」
キーワード: uprobe, uretprobe, USDT, DTRACE_PROBE, bpftrace, bcc, user-space tracing, SDT