问题标签 [ebpf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1406 浏览

c - BPF Helper 的 eBPF 隐式声明

我在编译使用 TC 安装的 eBPF 程序时遇到问题。目前,它只执行一些基本的修改,这需要重新计算 IP 校验和。

我注意到在 BPF 助手中,有一个函数 bpf_l3_csum_replace 这似乎是我想要的。但是,当我尝试使用使用 BPF_FUNC 宏映射的任何内置函数时,我得到一个隐式声明错误:

...警告:“bpf_l3_csum_replace”的隐式声明在 C99 中无效。

随后是来自验证者的错误:

... 不支持调用全局函数 'bpf_l3_csum_replace'。只允许调用预定义的 BPF 助手。

我的编译行:

我应该注意,只要我不使用任何“预定义”的 bpf 助手,我就可以编译和安装 BPF 对象(使用 TC)。一旦我这样做,问题就会出现。

我在内核树之外做这个,FWIW。不确定这是否是一个问题。我包括了 bpf 标头(linux/bpf.h),并且我使用了 iproute2 包中的 bpf_api.h 标头(对 bpf_helpers.h 标头没有太多运气)。

我对 eBPF 还是比较陌生,所以如果我遗漏了什么,我不会感到惊讶。任何帮助,将不胜感激。

编辑:代码

0 投票
1 回答
673 浏览

python - 使用 eBPF 在 Python 堆栈级别跟踪代码是否可行?

长期以来,非 Linux 平台上的 dtrace 一直被宣传为能够动态检测 node.js 代码以在节点级别进行动态跟踪,例如允许在 JavaScript 堆栈帧和变量级别调试节点程序(连同较低的级别跟踪)来自核心转储。

Linux 上的 eBPF 现在是否达到了这种复杂程度?我特别对 Python 感兴趣,但如果这个问题是针对任何类似的动态语言回答的,我会考虑回答这个问题。

如果没有,还需要做什么来支持它?

0 投票
1 回答
576 浏览

go - golang、ebpf 和函数持续时间

我正在玩 gobpf 并且在计算跟踪的用户空间函数的持续时间时遇到了问题。我使用 bpf_ktime_get_ns() 来读取时间,然后尝试计算增量,但是得到了巨大的数字,尽管跟踪的函数只休眠了 1 秒。

这是经过测试的 C 程序,它有一个名为“ameba”的函数。

去代码

程序输出示例:

PID 命令持续时间 RAW
15515 ameba 1193179h21m9.457496929s 4295445669457496929 15550
ameba 1193198h27m37.653709676s 4295514457653709676

哪里错了??

0 投票
1 回答
1062 浏览

trace - 在 eBPF 中取被调用函数的名称

我想跟踪特定 PID 的函数并收集一些统计信息(总调用次数、总时间等),但我并不完全清楚如何使用 funcname+my_struct 对创建 BPF_HASH。

有没有办法在 BPF 程序中获取被调用函数的名称?

我想我应该使用“PT_REGS_IP(ctx)”读取 IP 寄存器,但我不完全理解如何将值转换为人类可读的字符串。

目前 BPF 程序看起来如下:

但是在启动时我得到了:

0 投票
1 回答
873 浏览

c - eBPF,跟踪值长于堆栈大小?

我正在扩展一个程序,它接受跟踪函数的参数并打印它。数字参数和短字符串一切正常。但目前尚不清楚如何处理长于 eBPF 中堆栈大小的长字符串(限制为 512 字节)。

在下面的例子中,字符串被限制为 80 字节,当然最多可以增加到 512,但是如何跟踪更长的字符串呢?

带有被称为“ameba”的跟踪函数的 C 程序示例

Go 代码示例

我读到了 BPF_MAP_TYPE_PERCPU_ARRAY 在这种情况下可能会有所帮助,但我不清楚如何使用它。

编辑:Go 程序已修改为使用“C”和“不安全”。

0 投票
1 回答
1052 浏览

bpf - eBPF 程序将 HTTP 请求转发到不同的端口

我正在尝试实现一项功能,根据 HTTP 请求的路径,我可以将请求转发到不同的端口。

比如请求GET /foo,我想转发到81端口,如果是/bar我想转发到82端口。如果是别的,我想继续转发到端口 80,因为它是传入的。

有这样的示例 eBPF 程序吗?

我试图弄清楚我将如何确定 HTTP 请求是什么,因为 eBPF 将应用于数据包级别

0 投票
1 回答
243 浏览

x86-64 - 如何在 eBPF 程序中访问 xmm 寄存器

我正在尝试使用 bcc-tools 使用 uprobe 跟踪用户进程,但有些函数采用浮点参数。根据 x86_64 ABI,这些值通常在 xmm 寄存器中传递。

bcc 中的 eBPF 函数接受一个struct pt_regs *参数,因为我可以访问(?的副本?)大多数“常用”寄存器,但不能访问 xmm 寄存器。

有没有办法做到这一点?或者这是在 eBPF 的设计中被忽略的东西

0 投票
1 回答
359 浏览

linux-kernel - 为什么 sys_futex 上的 kretprobe 调用频率低于相应的 kprobe?

我正在跟踪各种内核函数和系统调用,并在它们之间建立可用于某些性能分析的模式。

我注意到的一件事是,有时,即使在我的简单测试应用程序中,它启动了一些与一些互斥锁一起使用的线程,我也不会收到任何kretprobe__sys_futexkprobe__sys_futex.

我假设这是因为例如一个线程正在调用sys_futex,并进入睡眠状态或可能终止,但我实际上看到相同的进程sys_futex连续多次调用,而返回探针却没有注意到任何事情。

然后我假设问题在于我如何过滤对 的调用kprobe__sys_futex,所以我使用 BCC/eBPF 做了一个最小的例子来测试这个:

我注意到在各种应用程序中(一个很好的例子是 mysql-server,即使在空闲时也会执行常规的 futex 操作 - 至少在我的机器上),futex start在返回探针的消息之前会打印许多(通常是 10+)s。

这是我在写这篇文章时运行了几分钟的上述程序的示例跟踪:

如您所见,例如 pid 697 似乎已经调用了sys_futex四次,而仅在这个小跟踪中没有返回。

我认为这不是 eBPF 代码中的竞争条件,因为如果您将打印语句静音并且只定期打印,则计数通常会在零附近的几个范围内sys_write,这比sys_futex(至少在我的系统的工作负载上)更频繁地发生),所以我希望任何竞争条件都会加剧而不是解决。

我在位于 VirtualBox 的 Ubuntu 18.04 LTS 上运行内核 4.15.0-43-generic。

很高兴提供更多可能有用的上下文!

IOVisor 邮件列表中有一个相关的主题:https ://lists.iovisor.org/g/iovisor-dev/topic/29702757

0 投票
1 回答
370 浏览

linux - 尝试访问“struct rq”时,bpf/bcc 报告错误

这是我用来分析内核函数的 bpf 程序pick_next_task_fiar

它报告错误如下:

我的问题是为什么 bpf 无法识别 ,struct rq因为我已经包含了# include <linux/sched.h>. 然而,它确实承认struct task_struct. 这两个结构在同一个头文件中。

内核版本:ubuntu 16.04 上的 4.4.0-141-generic

0 投票
1 回答
1030 浏览

bpf - 函数“bpf”的隐式声明

我最近一直在研究 BPF,但由于一个非常基本的问题而没有进行。

我按照 man bpf(2) 中的描述包含了 linux/bpf.h,但 GCC 找不到 bpf 函数。此代码仅用于测试以确保 GCC 可以找到 bpf 函数。

GCC 输出是这样的。

我使用的是 Archlinux,linux 内核版本是 4.20.11-arch1-1-ARCH。请帮助我如何包含 bpf 功能。