uprobes的PID过滤器正常,uretprobes的PID过滤失效致重复触发
Uretprobe PID过滤失效导致多次触发的问题
测试uprobes过程中发现,PID过滤器仅对uprobe生效,uretprobes不受PID过滤控制。具体场景如下:
- 运行两个独立应用,分别为PID
pid1和pid2的进程附加针对Func1函数的uprobe,代码实现:
uprobe_opts.func_name = "Func1"; uprobe_opts.retprobe = false; uprobe_link = bpf_program__attach_uprobe_opts(bpf_func_ent, pid1, lib_path, 0, &uprobe_opts); uprobe_opts.func_name = "Func1"; uprobe_opts.retprobe = false; uprobe_link = bpf_program__attach_uprobe_opts(bpf_func_ent, pid2, lib_path, 0, &uprobe_opts);
- 同时为这两个进程附加针对
Func1的uretprobe,代码实现:
uprobe_opts.func_name = "Func1"; uprobe_opts.retprobe = true; uprobe_link = bpf_program__attach_uprobe_opts(bpf_func_ret, pid1, lib_path, 0, &uprobe_opts); uprobe_opts.func_name = "Func1"; uprobe_opts.retprobe = true; uprobe_link = bpf_program__attach_uprobe_opts(bpf_func_ret, pid2, lib_path, 0, &uprobe_opts);
其中lib_path是目标共享库的路径。
现象总结:
- 调用
Func1时,对应uprobe的入口函数仅触发1次(符合预期),但uretprobe的返回函数会被触发2次; - 删除针对
pid2的uretprobe后,uprobe和uretprobe均仅触发1次,恢复正常; - 若添加更多不同PID的uretprobe,uretprobe的触发次数会随附加数量线性增加。
当前环境:Linux内核版本5.14,libbpf版本1.1。
内容的提问来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

