如何在bpftrace中过滤进程名称?及《BPF性能工具》习题解答求助
BPFtrace过滤问题与《BPF性能工具》习题解答
一、修复bpftrace命令的进程过滤逻辑
你用/comm == "man"/没生效的核心原因是:sys_enter_exec*触发时,进程还没完成程序替换,此时comm是发起exec调用的父进程名称,不是你要追踪的man程序名。根据你的需求,有两种正确的过滤方式:
1. 追踪特定父进程发起的exec调用
如果只想看由某个进程(比如bash)启动的程序,直接匹配comm即可,修正后的命令:
sudo bpftrace -o output.txt -e 'BEGIN {printf("%-10s %-5s %s\n", "TIME(ms)", "PID", "ARGS"); } t:syscalls:sys_enter_exec* /comm == "bash"/ { printf("%-10u %-5d ", elapsed / 1e6, pid); join(args->argv); } interval:s:60 { exit(); }'
2. 追踪特定目标程序的exec调用
如果要追踪所有执行man的操作,需要匹配args->filename(即要执行的程序路径),可以用模糊匹配或精确匹配:
# 模糊匹配所有路径含man的程序 sudo bpftrace -o output.txt -e 'BEGIN {printf("%-10s %-5s %s\n", "TIME(ms)", "PID", "ARGS"); } t:syscalls:sys_enter_exec* /str(args->filename) ~ "man"/ { printf("%-10u %-5d ", elapsed / 1e6, pid); join(args->argv); } interval:s:60 { exit(); }' # 精确匹配man的完整路径 sudo bpftrace -o output.txt -e 'BEGIN {printf("%-10s %-5s %s\n", "TIME(ms)", "PID", "ARGS"); } t:syscalls:sys_enter_exec* /str(args->filename) == "/usr/bin/man"/ { printf("%-10u %-5d ", elapsed / 1e6, pid); join(args->argv); } interval:s:60 { exit(); }'
另外,你提到execsnoop部分参数丢失的问题,可以试试在bpftrace命令里加-c <数值>参数调大maxargs(默认是20),比如bpftrace -c 50 ...,这样能获取更多命令参数。
二、《BPF性能工具》习题解答的获取渠道
这本书的官方仓库确实没有公开配套习题解答,但可以通过这些途径找相关内容:
- 作者Brendan Gregg会在技术社区分享BPF实践内容,里面可能包含习题的思路或实现方案;
- 去BPF相关的技术社区(比如Reddit的r/bpf板块、国内的掘金、知乎)搜,很多学习者会分享自己做习题的过程和答案;
- 查看bcc、bpftrace等BPF工具的仓库讨论区,部分习题的实现逻辑可能在issue里被讨论过。
内容的提问来源于stack exchange,提问作者NicoW
相关产品推荐
相关产品推荐

