ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

bpftrace探测程序

2026/10/3 20:06:19 拓冰建站 浏览量
bpftrace探测程序 bpftrace 简单示例前提安装 bpftrace内核开启 BPF 支持需要 root 运行sudo bpftrace xxx.bt 语法bpftrace 是类 awk 语言probe /filter/ { action }示例1探测某个进程的 open 系统调用最常用入门文件名trace_open.bt#!/usr/bin/env bpftrace // 探针syscall:sys_openat现代linux打开文件用openat // 过滤只看 PID1234 的进程把1234换成你要探测的程序pid tracepoint:syscalls:sys_enter_openat /pid 1234/ { printf(PID:%d 打开文件: %s\n, pid, str(args-filename)); }运行sudo bpftrace trace_open.bt然后启动你的目标程序它每次调用 openat 打开文件就会打印路径。如果想按进程名过滤比如探测nginxtracepoint:syscalls:sys_enter_openat /comm nginx/ { printf(PID:%d comm:%s file:%s\n, pid, comm, str(args-filename)); }示例2kprobe 捕获函数调用探测程序内部函数适合用户态/内核函数假设你要探测目标程序/bin/bash里的readline用户态函数用户态函数需要符号 文件名trace_readline.bt#!/usr/bin/env bpftrace uprobe:/bin/bash:readline { printf(bash readline() called, pid:%d\n, pid); }运行sudo bpftrace trace_readline.bt新开 bash敲回车就会触发。uprobe 用户态探针kprobe 内核函数探针。示例3统计进程调用 read 的耗时带时间tracepoint:syscalls:sys_enter_read /pid 1234/ { start[tid] nsecs; } tracepoint:syscalls:sys_exit_read /pid 1234 start[tid]/ { $dur nsecs - start[tid]; printf(read 耗时: %d ns\n, $dur); delete(start[tid]); }直接在命令行单行运行不用写文件快速试sudo bpftrace -e tracepoint:syscalls:sys_enter_openat /comm cat/ { printf(file: %s\n, str(args-filename)); }另开终端执行cat /etc/passwd你就能看到打印。参考链接 0voice · GitHub