Pid 过滤器适用于 uprobes,但不适用于 uretprobes

问题描述 投票:0回答:1

在测试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 的调用次数会线性增加。

linux-kernel kernel ebpf libbpf uprobe
1个回答
0
投票

我最近也遇到了同样的问题。

深入研究内核代码后,我发现 PID 过滤器没有应用于 uretprobe。在尝试解决缺失的检查后,uretprobe 上的 PID 过滤器开始正常运行。然而,考虑到与 uprobes 相关的内核代码已经有十多年没有修改了,我目前不确定这是我的工具链的问题还是我对 PID 过滤机制的理解的问题。我目前正在研究 BCC 中的一些示例程序来重现这个问题,如果确认稳定,我将向 linux 社区提交补丁。

如果您仍然对此感到困惑,我想让您知道,这可能不是您的错误。”

© www.soinside.com 2019 - 2024. All rights reserved.