问题标签 [bcc-bpf]

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 回答
502 浏览

linux-kernel - 无法使用密件抄送工具将 eBPF `kretprobes` 附加到 `napi_poll()`

想法是用来argdist测量延迟时间,napi_poll()其中返回处理的数据包数量(称为工作)。执行延迟与napi_poll()处理的数据包数量的比率将为我提供以直方图形式处理每个数据包所需的平均时间。

我正在使用以下命令

argdist -H 'r:c:napi_poll():u64:$latency/$retval#avg time per packet (ns)' 这最终给了我错误Failed to attach BPF to kprobe,在 dmesg 我收到类似的消息Could not insert probe at napi_poll+0: -2

我只是好奇为什么当类似的技巧适用时kretprobes我不能附加?napi_poll()net_rx_action()

0 投票
1 回答
1420 浏览

c - 如何从内核空间确定 PID 位于哪些命名空间?

我正在尝试编写一个 eBPF 程序来记录系统上运行的容器对特定系统调用的每次调用。我正在使用密件抄送,可以使用bpf_get_current_pid_tgid().

从用户空间我可以检查 proc 文件系统以确定进程的名称空间是否与根名称空间不同,以猜测它是否是容器进程,但我不知道你如何从内核空间做到这一点?

0 投票
1 回答
252 浏览

compiler-errors - 在 alpine 中构建 bcc,“未命名类型”错误

我正在尝试构建 bcc bccAlpine。

这是我编写的要编译的 Dockerfile bcc

不幸的是,在运行时make我偶然发现了以下错误:

我该如何解决这个问题?

0 投票
1 回答
356 浏览

bpf - 在 BPF 程序中总是得到 0 会话 ID

我正在尝试编写一个 BPF 程序来检查调用tty_write内核函数的任何进程的会话 ID。我试图通过从当前task_struct结构中检索一个字段来做到这一点。我的代码如下:

请注意,我正在将我的 BPF 程序编译clang成一个 ELF 文件并使用gobpf 的ELF 包加载它。不幸的是, 的值sessionid始终为 0。这是为什么呢?我认为我没有错误地访问会话 ID,因为我在 4.11 内核上使用bcc之前已经这样做了(由于 bcc 如何重写 BPF 程序,当我想自己编译程序时,我不能简单地使用相同的代码)。用于访问的等效工作密件抄送代码sessionid如下。请注意,这仅适用于 4.11 内核,以下代码不适用于 4.13 内核。然而,上面的代码在这两个内核上都不起作用。

4.11内核:

uname -a:Linux ubuntu16 4.11.0-14-generic #20~16.04.1-Ubuntu SMP Wed Aug 9 09:06:22 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

4.13内核:

uname -a: Linux ubuntu1710 4.13.0-32-generic #35-Ubuntu SMP Thu Jan 25 09:13:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

0 投票
0 回答
403 浏览

c - 如何使用 BCC 将我的 BPF 程序编译为 ELF 文件?

我想使用bcc来编译我的 BPF 程序。我见过的所有示例都使用 BCC 即时编译代码,但我想使用它来提前将我的 BPF 程序编译为 ELF 文件,然后我可以通过gobpf单独加载该文件。

BCC 是否公开此功能?

编辑:

我想这样做的原因是由于我之前发布的问题。在那个问题中,我描述了一种情况,我只能使用 bcc 的 Python 绑定让我的代码工作,但是当我尝试直接使用 clang 编译 BPF 程序并使用 gobpf 加载它时失败了——我现在想尝试使用 bcc 来将我的 BPF 程序编译为 ELF 文件,而不是直接使用 clang 进行编译,希望它可以使用 gobpf 加载并按预期工作。

0 投票
0 回答
346 浏览

linux - 用于用户空间范围内存泄漏检测的密件抄送工具 memleak

是否有人使用 bcc 中的 memleak 工具来分析用户空间内存分配?我一直在尝试调整它来做到这一点,但它似乎非常不可靠,即第一批未完成的分配在使用虚拟 C 应用程序测试时似乎很好,但通常在接下来的批次中,由于某种原因,条目会人为地消失/增加. 我的猜测是由于用户空间中的分配频率很高,哈希表会溢出?有没有人设法使用 ebpf(或任何其他工具)进行 mem 用户空间范围的分析?

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 回答
2876 浏览

bpf - 安装 bcc 时,找不到包 bpfcc

我正在尝试在我的 Linux 机器上安装 bcc 模块,以便编写 BPF 程序。

我一直在跟进页面

https://github.com/iovisor/bcc/blob/master/INSTALL.md#kernel-configuration

构建内核并安装 bcc 模块。

但是,每当我输入

我收到一个错误:

如果我问的基本问题太多了,我很抱歉。这是唯一一个似乎有聪明人有一些答案的地方。提前谢谢你们