从方法签名的组成规则我们可以看出,方法的返回类型不是方法签名的组成部分,所以当同一个类中出现了多个方法名和参数相同,但返回值类型不同的方法时,JVM 就没办法通过方法签名来判断到底要调用哪个方法了,如下图所示...: 那为什么返回类型不能做为方法签名的一部分呢?...原因其实很简单,试想一下,如果方法的返回类型也作为方法签名的一部分,那么当程序员写了一个代码去调用“重载”的方法时,JVM 就不能分辨要调用哪个方法了,如下代码所示: public class OverloadExample...总结 在同一个类中定义了多个同名方法,但每个方法的参数类型或者是参数个数不同就是方法重载。方法重载的典型使用场景是 String 中的 valueOf 方法,它有 9 种实现。...方法返回类型不能作为方法重载的依据,因为它不是方法签名的组成部分。
Fentryfentry(function entry)和 fexit(function exit)是 eBPF(扩展的伯克利包过滤器)中的两种探针类型,用于在 Linux 内核函数的入口和退出处进行跟踪...与 kprobes 相比,fentry 和 fexit 程序有更高的性能和可用性。在这个例子中,我们可以直接访问函数的指针参数,就像在普通的 C 代码中一样,而不需要使用各种读取帮助程序。...fexit 和 kretprobe 程序最大的区别在于,fexit 程序可以访问函数的输入参数和返回值,而 kretprobe 只能访问返回值。...定义 fentry 探针:我们定义了一个名为 BPF_PROG(do_unlinkat) 的 fentry 探针,该探针在 do_unlinkat 函数的入口处被触发。...和 do_unlinkat_exit 函数,并通过使用 bpf_get_current_pid_tgid 和 bpf_printk 函数获取调用 do_unlinkat 的进程的 ID、文件名和返回值
这两个函数通过使用 bpf_get_current_pid_tgid 和 bpf_printk 函数来获取调用 do_unlinkat 的进程 ID,文件名和返回值,并在内核日志中打印出来。...与 kprobes 相比,fentry 和 fexit 程序有更高的性能和可用性。在这个例子中,我们可以直接访问函数的指针参数,就像在普通的 C 代码中一样,而不需要使用各种读取帮助程序。...fexit 和 kretprobe 程序最大的区别在于,fexit 程序可以访问函数的输入参数和返回值,而 kretprobe 只能访问返回值。...bpf_get_current_pid_tgid 和 bpf_printk 函数获取调用 do_unlinkat 的进程 ID、文件名和返回值,并在内核日志中打印出来。...更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档:https://github.com/eunomia-bpf/eunomia-bpf 完整的教程和源代码已经全部开源,可以在 https
什么是uprobeuprobe是一种用户空间探针,uprobe探针允许在用户空间程序中动态插桩,插桩位置包括:函数入口、特定偏移处,以及函数返回处。...[] SEC("license") = "GPL";这段代码的作用是在 bash 的 readline 函数返回时执行指定的 BPF_KRETPROBE 函数,即 printret 函数。...在 SEC 宏中,我们需要指定 uprobe 的类型、要捕获的二进制文件的路径和要捕获的函数名称。...bpf_get_current_comm(&comm, sizeof(comm));使用 bpf_get_current_pid_tgid 函数获取当前进程的 PID,并将其存储在 pid 变量中。...pid = bpf_get_current_pid_tgid() >> 32;使用 bpf_probe_read_user_str 函数从用户空间读取 readline 函数的返回值,并将其存储在 str
它的功能是在每个 TCP 连接建立时,统计连接数并保存在哈希表 stats 中。...在 probe 函数中,使用 bpf_get_current_pid_tgid() 获取当前进程的 PID,然后通过 FILTER 宏来过滤不需要监控的进程。...在这个例子中,使用 pid 参数来指定需要监控的进程,如果当前进程的 PID 不是指定的 PID,就直接返回。...在创建过程中,程序和过滤器会被编译为二进制代码,并在需要的地方被调用。 这里使用BPF类创建eBPF程序,传入的参数text是一个字符串类型,表示eBPF程序的代码。...定义输出函数: def print_stats(): #获取BPF程序中的hash table stats,用于存储每个进程的连接数 stats = bpf["stats"] for
在 Linux 系统中,进程与文件之间的交互是通过系统调用来实现的。系统调用是用户态程序与内核态程序之间的接口,它们允许用户态程序请求内核执行特定操作。...在 eBPF 中捕获进程打开文件的系统调用集合首先,我们需要编写一段 eBPF 程序来捕获进程打开文件的系统调用,具体实现如下:#include #include <bpf/bpf_helpers.h...使用全局变量在 eBPF 中过滤进程 pid全局变量在 eBPF 程序中充当一种数据共享机制,它们允许用户态程序与 eBPF 程序之间进行数据交互。...使用全局变量的原理是,全局变量在 eBPF 程序的数据段(data section)中定义并存储。当 eBPF 程序加载到内核并执行时,这些全局变量会保持在内核中,可以通过 BPF 系统调用进行访问。...我们可以使用 bpf_get_current_pid_tgid 函数获取调用 open 或 openat 系统调用的进程 ID,并使用 bpf_printk 函数在内核日志中打印出来。
; bpf_get_current_pid_tgid() 函数返回当前进程的 PID 和 TID,通过右移 32 位,我们得到 PID。...event) return 1; 通过 bpf_ringbuf_reserve() 函数预留 Ring Buffer 空间,用于存储采集的栈信息。若预留失败,返回错误....这个内核态 eBPF 程序通过定期采样程序的内核栈和用户空间栈来捕获程序的执行流程。这些数据将存储在 Ring Buffer 中,以便用户态的 profile 程序能读取。...然后,使用 perf_event_open() 函数为当前 CPU 设置 perf event,并将返回的文件描述符存储在 pefds 数组中。...在本教程中,我们还展示了如何编写 eBPF 程序来捕获进程的内核和用户空间栈信息,进而分析程序性能瓶颈。通过这个例子,您可以了解到 eBPF 在性能分析方面的强大功能。
该函数通过使用 bpf_get_current_pid_tgid 和 bpf_printk 函数获取调用 write 系统调用的进程 ID,并在内核日志中打印出来。...使用 BPF 助手函数:在例如 BPF 函数中,可以使用 BPF 助手函数 bpf_get_current_pid_tgid() 和 bpf_printk()。...返回值 tracepoints 跟踪点(tracepoints)是内核静态插桩技术,跟踪点在技术上只是放置在内核源代码中的跟踪函数,实际上就是在源码中插入的一些带有控制条件的探测点,这些探测点允许事后再添加处理函数...比如在内核中,最常见的静态跟踪方法就是 printk,即输出日志。又比如:在系统调用、调度程序事件、文件系统操作和磁盘 I/O 的开始和结束时都有跟踪点。...完整的教程和源代码已经全部开源,可以在 https://github.com/eunomia-bpf/bpf-developer-tutorial 中查看。
在 Linux 中,getdents64 系统调用可以读取目录下的文件信息。我们可以通过挂接这个系统调用,修改它返回的结果,从而达到隐藏文件的目的。...程序中定义了一系列的 map 结构,这些 map 是 eBPF 程序中的主要数据结构,它们用于在内核态和用户态之间共享数据,或者在 eBPF 程序中存储和传递数据。...在确认了当前进程是我们关注的进程之后,我们将 getdents64 系统调用的参数保存到一个 map 中,以便在系统调用返回时使用。...在系统调用返回时,我们将会在 handle_getdents_exit 函数中,对目录项进行修改,以实现进程隐藏。 在接下来的代码段中,我们将要实现在 getdents64 系统调用返回时的处理。...最后,我们清理了之前保存在 map 中的数据,并返回。 这段代码是在 eBPF 环境下实现进程隐藏的一个很好的例子。
在 Linux 中,getdents64 系统调用可以读取目录下的文件信息。我们可以通过挂接这个系统调用,修改它返回的结果,从而达到隐藏文件的目的。...程序中定义了一系列的 map 结构,这些 map 是 eBPF 程序中的主要数据结构,它们用于在内核态和用户态之间共享数据,或者在 eBPF 程序中存储和传递数据。...在确认了当前进程是我们关注的进程之后,我们将 getdents64 系统调用的参数保存到一个 map 中,以便在系统调用返回时使用。...在系统调用返回时,我们将会在 handle_getdents_exit 函数中,对目录项进行修改,以实现进程隐藏。在接下来的代码段中,我们将要实现在 getdents64 系统调用返回时的处理。...最后,我们清理了之前保存在 map 中的数据,并返回。这段代码是在 eBPF 环境下实现进程隐藏的一个很好的例子。
因此不论在何种情况下,在回调函数中不要调用会放弃 CPU 的函数(如信号量、mutex 锁等);kretprobe 通过替换返回地址为预定义的 trampoline 的地址来实现,因此栈回溯和 gcc...ret = %ld\n", pid, ret); return 0;}这段代码是一个简单的 eBPF 程序,用于监测和捕获在 Linux 内核中执行的 unlink 系统调用。...unlink 系统调用的功能是删除一个文件,这个 eBPF 程序通过使用 kprobe(内核探针)在do_unlinkat函数的入口和退出处放置钩子,实现对该系统调用的跟踪。...首先,我们导入必要的头文件,如 vmlinux.h,bpf_helpers.h,bpf_tracing.h 和 bpf_core_read.h。接着,我们定义许可证,以允许程序在内核中运行。...这个 kretprobe 的目的是捕获函数的返回值(ret)。我们再次获取当前进程的 PID,并使用bpf_printk函数在内核日志中打印 PID 和返回值。
();````bpf_get_current_pid_tgid()` 函数返回当前进程的 PID 和 TID,通过右移 32 位,我们得到 PID。...若预留失败,返回错误.获取当前进程名:```cif (bpf_get_current_comm(event->comm, sizeof(event->comm))) event->comm[0]...这个内核态 eBPF 程序通过定期采样程序的内核栈和用户空间栈来捕获程序的执行流程。这些数据将存储在 Ring Buffer 中,以便用户态的 `profile` 程序能读取。...然后,使用 perf_event_open() 函数为当前 CPU 设置 perf event,并将返回的文件描述符存储在 pefds 数组中。...在本教程中,我们还展示了如何编写 eBPF 程序来捕获进程的内核和用户空间栈信息,进而分析程序性能瓶颈。通过这个例子,您可以了解到 eBPF 在性能分析方面的强大功能。
虽然不同工具的特点各异,但它们的基本开发流程大致相同。在接下来的内容中,我们将深入了解这些流程,并以 Hello World 程序为例,带领读者逐步掌握eBPF开发的基本技巧。...该函数通过使用 bpf_get_current_pid_tgid 和 bpf_printk 函数获取调用 write 系统调用的进程 ID,并在内核日志中打印出来。...一个更好的方式是通过 BPF_PERF_OUTPUT(), 稍后将会讲到。void *ctx:ctx本来是具体类型的参数, 但是由于我们这里没有使用这个参数,因此就将其写成void *类型。...使用 BPF 助手函数:在例如 BPF 函数中,可以使用 BPF 助手函数 bpf_get_current_pid_tgid() 和 bpf_printk()。...返回值tracepoints跟踪点(tracepoints)是内核静态插桩技术,在技术上只是放置在内核源代码中的跟踪函数,实际上就是在源码中插入的一些带有控制条件的探测点,这些探测点允许事后再添加处理函数
BPF验证器BPF借助跟踪探针收集信息并进行调试和分析,与其它依赖于重新编译内核的工具相比,BPF程序的安全性更高。重新编译内核引入外部模块的方式,可能会因为程序的错误而产生系统奔溃。...缺点没有稳定的应用程序二进制接口,可能随着内核版本的演进而更改。3.2 kprobeskprobe程序允许在执行内核函数之前插入BPF程序。...kfree_skb时,执行程序中的trace_kfree_skb函数;BPF程序的第一个参数总为ctx,该参数称为上下文,提供了访问内核正在处理的信息,依赖于正在运行的BPF程序的类型。...当内核执行到kretprobe挂载的内核函数时,先执行内核函数,当内核函数返回时执行BPF程序,运行结束后返回。...()指定了该BPF程序类型为kretprobe,kretprobe类型的BPF程序将在跟踪的内核函数有返回值时执行BPF程序;event="kfree_skb"指定了kretprobe挂载的内核函数为kfree_skb
BPF验证器 BPF借助跟踪探针收集信息并进行调试和分析,与其它依赖于重新编译内核的工具相比,BPF程序的安全性更高。重新编译内核引入外部模块的方式,可能会因为程序的错误而产生系统奔溃。...缺点 没有稳定的应用程序二进制接口,可能随着内核版本的演进而更改。 3.2 kprobes kprobe程序允许在执行内核函数之前插入BPF程序。...python和c中出现的陌生函数可以查下面这两个手册,在此不再赘述: python部分遇到的陌生函数可以查这个手册: 点此跳转 c部分中遇到的陌生函数可以查这个手册: 点此跳转 需要说明的是,该BPF程序类型是...kfree_skb时,执行程序中的trace_kfree_skb函数; BPF程序的第一个参数总为ctx,该参数称为上下文,提供了访问内核正在处理的信息,依赖于正在运行的BPF程序的类型。...()指定了该BPF程序类型为kretprobe,kretprobe类型的BPF程序将在跟踪的内核函数有返回值时执行BPF程序; event="kfree_skb"指定了kretprobe挂载的内核函数为
另外,合成和真实世界的基准测试表明,在几乎所有的情况下,所以考虑将其作为从BPF程序向用户空间发送数据的默认选择。...定义一个名为 rb 的 BPF_MAP_TYPE_RINGBUF 类型的映射,它将用于将内核空间的数据传输到用户空间。...我们只关心进程(主线程)的退出,因此在 PID 和 TID 不同时返回 0,忽略子线程退出事件。...使用 bpf_ringbuf_reserve 函数为事件结构体 e 在 ring buffer 中预留空间。如果预留失败,返回 0。...开发一个简单的 BPF 程序,该程序可以监控 Linux 系统中的进程退出事件, 并将捕获的事件通过 ring buffer 发送给用户空间程序。
在探针函数中,我们使用 bpf_map 存储捕获的事件信息,包括发送信号的进程 ID、接收信号的进程 ID、信号值和系统调用的返回值。...在系统调用退出时,我们将获取存储在 bpf_map 中的事件信息,并使用 bpf_printk 打印进程 ID、进程名称、发送的信号和系统调用的返回值。...eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。...更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档:https://github.com/eunomia-bpf/eunomia-bpf 完整的教程和源代码已经全部开源,可以在 https...://github.com/eunomia-bpf/bpf-developer-tutorial 中查看。
bpf_prog_type BPF prog 入口参数(R1) 程序类型 BPF_PROG_TYPE_ SOCKET_FILTER struct __sk_buff 用于过滤进出口网络报文,功能上和 cBPF...BPF_PROG_TYPE_ CGROUP_SKB struct __sk_buff 用于在 network cgroup 中运行的 BPF 代码。功能上 和 Socket_Filter 近似。...然后通过bpf系统调用,将BPF字节码注入到内核中,在注入的时候,我们必须要经过BPF程序的验证,来保证我们写的BPF程序没有问题,以防干掉我们的系统。...在执行BPF程序的过程中,会将需要保存的数据存储到map空间中,用户时候可以从map空间读取出数据。BPF程序的大致流程就是这个样子。 注意:BPF是基于事件触发的。这是什么意思呢?...例如:系统调用的参数值、返回值,然后通过Map空间,将得到的信息传递给用户态的程序,进而可以在用户程序中在进行逻辑处理。
在 eBPF 中捕获进程打开文件的系统调用集合 首先,我们需要编写一段 eBPF 程序来捕获进程打开文件的系统调用,具体实现如下: #include #include <bpf/...这个函数通过使用 bpf_get_current_pid_tgid 函数获取调用 openat 系统调用的进程 ID,并使用 bpf_printk 函数在内核日志中打印出来。...使用全局变量在 eBPF 中过滤进程 pid 在上面的程序中,我们定义了一个全局变量 pid_target 来指定要捕获的进程的 pid。...我们可以使用 bpf_get_current_pid_tgid 函数获取调用 open 或 openat 系统调用的进程 ID,并使用 bpf_printk 函数在内核日志中打印出来。...在 eBPF 程序中,我们还可以通过定义一个全局变量 pid_target 来指定要捕获的进程的 pid,从而过滤输出,只输出指定的进程的信息。
在本篇教程中,我们将探讨如何使用 eBPF 编写 Memleak 程序,以监控程序的内存泄漏。背景及其重要性内存泄漏是计算机编程中的一种常见问题,其严重程度不应被低估。...这可能是由于配置错误导致的,例如程序错误地配置了某些资源的动态分配。它也可能是由于软件缺陷或错误的内存管理策略导致的,如在程序执行过程中忘记释放不再需要的内存。...和number_of_allocs,从而避免了在程序中定义额外的变量和函数的复杂性。...在理解这些代码的过程中,要注意 BPF_CORE_READ 宏的使用。这个宏用于在 bpf 程序中读取内核数据。在 bpf 程序中,我们不能直接访问内核内存,而需要使用这样的宏来安全地读取数据。...在Linux中,uprobes是一种内核机制,可以在用户空间程序中的任意位置设置断点,这使得我们可以非常精确地观察和控制用户空间程序的行为。
领取专属 10元无门槛券
手把手带您无忧上云