libbpf-bootstrap开发指南:用户态探针 - uprobe

文章详细分析了一个使用BPF(BerkeleyPacketFilter)技术进行用户态程序跟踪的示例。代码定义了针对uprobed_add和uprobed_sub函数的uprobe及uretprobe,通过/proc/self/maps文件获取函数偏移量,并在程序运行时触发BPF跟踪点,打印出函数的入口和退出信息。主要涉及Linux内核探针技术以及libbpf库的使用。

目录

代码分析

BPF 程序分析

功能分析

头文件引入

SEC("uprobe//proc/self/exe:uprobed_sub")

BPF_KPROBE&BPF_KRETPROBE

用户态程序分析

功能说明

/proc/self/maps 文件

执行效果


代码分析

BPF 程序分析
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
/* Copyright (c) 2020 Facebook */
#include <linux/bpf.h>
#include <linux/ptrace.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>

char LICENSE[] SEC("license") = "Dual BSD/GPL";

SEC("uprobe")
int BPF_KPROBE(uprobe_add, int a, int b)
{
	bpf_printk("uprobed_add ENTRY: a = %d, b = %d", a, b);
	return 0;
}

SEC("uretprobe")
int BPF_KRETPROBE(uretprobe_add, int ret)
{
	bpf_printk("uprobed_add EXIT: return = %d", ret);
	return 0;
}

SEC("uprobe//proc/self/exe:uprobed_sub")
int BPF_KPROBE(uprobe_sub, int a, int b)
{
	bpf_printk("uprobed_sub ENTRY: a = %d, b = %d", a, b);
	return 0;
}

SEC("uretprobe//proc/self/exe:uprobed_sub")
int BPF_KRETPROBE(uretprobe_sub, int ret)
{
	bpf_printk("uprobed_sub EXIT: return = %d", ret);
	return 0;
}
功能分析

主要定义了一些 uprobe 和 uretprobe 函数,用于在用户空间程序的特定函数进入和返回时进行跟踪。

头文件引入
  1. #include <linux/bpf.h>: 这个头文件定义了 BPF 的基本数据类型和函数,如 bpf_map_update_elem、bpf_map_lookup_elem 等。此外,它还定义了 BPF 程序类型(如 BPF_PROG_TYPE_KPROBE)和一些宏(如 BPF_ANY、BPF_NOEXIST 等)。
  2. #include <linux/ptrace.h>: 这个头文件定义了 struct pt_regs 结构体,这个结构体在 BPF 程序中常用于访问 CPU 寄存器的值。在你的 BPF 程序中,struct pt_regs 是 BPF_KPROBE 和 BPF_KRETPROBE 函数的参数类型。
  3. #include <bpf/bpf_helpers.h>: 这个头文件定义了一些 BPF 辅助函数,如 bpf_printk。在你的 BPF 程序中,bpf_printk 函数用于打印调试信息。
  4. #include <bpf/bpf_tracing.h>: 这个头文件定义了一些宏,这些宏用于从 struct pt_regs 结构体中提取参数和返回值。在你的 BPF 程序中,例如 PT_REGS_PARM1(ctx) 和 PT_REGS_RC(ctx) 使用了这个头文件提供的宏。
SEC("uprobe//proc/self/exe:uprobed_sub")

SEC 宏用于定义 BPF 程序的一个 section,这个 section 的名字是 "uprobe//proc/self/exe:uprobed_sub"。

"uprobe//proc/self/exe:uprobed_sub" 这个字符串有三部分:

  1. "uprobe": 这表示这个 section 是一个 uprobe 类型的 BPF 程序。
  2. "/proc/self/exe": 这是目标程序的路径。/proc/self/exe 是一个在 Linux 系统中的特殊路径,它是一个符号链接,指向当前进程的可执行文件。
  3. "uprobed_sub": 这是目标程序中要跟踪的函数的名字。

所以,SEC("uprobe//proc/self/exe:uprobed_sub") 这段代码的意思是:定义一个 uprobe 类型的 BPF 程序,用于在当前进程的可执行文件中的 uprobed_sub 函数入口处设置一个跟踪点。

BPF_KPROBE&BPF_KRETP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ym影子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值