目录
SEC("uprobe//proc/self/exe:uprobed_sub")
代码分析
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 函数,用于在用户空间程序的特定函数进入和返回时进行跟踪。
头文件引入
- #include <linux/bpf.h>: 这个头文件定义了 BPF 的基本数据类型和函数,如 bpf_map_update_elem、bpf_map_lookup_elem 等。此外,它还定义了 BPF 程序类型(如 BPF_PROG_TYPE_KPROBE)和一些宏(如 BPF_ANY、BPF_NOEXIST 等)。
- #include <linux/ptrace.h>: 这个头文件定义了 struct pt_regs 结构体,这个结构体在 BPF 程序中常用于访问 CPU 寄存器的值。在你的 BPF 程序中,struct pt_regs 是 BPF_KPROBE 和 BPF_KRETPROBE 函数的参数类型。
- #include <bpf/bpf_helpers.h>: 这个头文件定义了一些 BPF 辅助函数,如 bpf_printk。在你的 BPF 程序中,bpf_printk 函数用于打印调试信息。
- #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" 这个字符串有三部分:
- "uprobe": 这表示这个 section 是一个 uprobe 类型的 BPF 程序。
- "/proc/self/exe": 这是目标程序的路径。/proc/self/exe 是一个在 Linux 系统中的特殊路径,它是一个符号链接,指向当前进程的可执行文件。
- "uprobed_sub": 这是目标程序中要跟踪的函数的名字。
所以,SEC("uprobe//proc/self/exe:uprobed_sub") 这段代码的意思是:定义一个 uprobe 类型的 BPF 程序,用于在当前进程的可执行文件中的 uprobed_sub 函数入口处设置一个跟踪点。

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

被折叠的 条评论
为什么被折叠?



