You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

bpf_program__attach_uprobe_opts仅支持指定单个PID吗?多PID如何设置?

关于bpf_program__attach_uprobe_opts设置多个PID的问题

确实,bpf_program__attach_uprobe_opts的接口设计里,pid字段仅支持指定单个进程ID,或是设为-1匹配所有进程,没有直接配置多PID的参数选项。

要实现针对多个特定PID的探测,最常用且推荐的方案是借助BPF map做过滤:

  • 先创建一个哈希表(BPF_MAP_TYPE_HASH),将需要监控的PID存入该map中;
  • 在uprobe的BPF程序逻辑里,通过bpf_get_current_pid_tgid()获取当前进程的PID(注意:部分环境下取返回值的低32位为PID,部分为高32位,需根据实际环境调整);
  • 检查该PID是否存在于目标map中,仅当存在时才执行后续探测逻辑,否则直接返回。

以下是简化的代码示例:

// 定义存储目标PID的哈希map
struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __uint(max_entries, 100);
    __type(key, u32);
    __type(value, u8); // 仅用做存在性标记,值无实际意义
} target_pids SEC(".maps");

SEC("uprobe/target_func")
int uprobe_handler(struct pt_regs *ctx) {
    u32 pid = bpf_get_current_pid_tgid() >> 32; // 此处以高32位为PID为例,需根据环境调整
    u8 *is_target;

    // 检查当前PID是否在监控列表中
    is_target = bpf_map_lookup_elem(&target_pids, &pid);
    if (!is_target) {
        return 0; // 不在列表内,直接退出
    }

    // 执行你的探测逻辑
    // ...

    return 0;
}

当然,你也可以通过多次调用bpf_program__attach_uprobe_opts,为每个目标PID单独创建uprobe实例,但这种方式在PID数量较多时会产生大量uprobe对象,既占用更多系统资源,也增加了管理复杂度,因此通常不建议采用。

综上,利用BPF map实现PID过滤是更高效、更易维护的方案。

内容的提问来源于stack exchange,提问作者Sunjal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 21:22:41