在测试uprobes时,发现PID过滤器仅适用于uprobes,而不适用于uretprobes。 我有两个应用程序正在运行,并针对每个具有 PID pid1 和 pid2 的应用程序附加了 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);
使用 PID 过滤器用于相同应用的类似连接的尿管探头
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 入口函数仅被调用一次,但 retuprobe 函数被命中两次。
Linux 内核版本是 5.14,libbpf 版本是 1.1。
我确实尝试使用 pid2 删除第二个应用程序的 uretprobe,它工作正常,uprobe 和 uretprobe 都只被调用一次。但是当我不断使用不同的 Pid 添加 uretprobe 时,uretprobe 的调用次数会线性增加。
我最近也遇到了同样的问题。
深入研究内核代码后,我发现 PID 过滤器没有应用于 uretprobe。在尝试解决缺失的检查后,uretprobe 上的 PID 过滤器开始正常运行。然而,考虑到与 uprobes 相关的内核代码已经有十多年没有修改了,我目前不确定这是我的工具链的问题还是我对 PID 过滤机制的理解的问题。我目前正在研究 BCC 中的一些示例程序来重现这个问题,如果确认稳定,我将向 linux 社区提交补丁。
如果您仍然对此感到困惑,我想让您知道,这可能不是您的错误。”