问题标签 [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 投票
0 回答
114 浏览

ebpf - 在内核空间中使用 eBPF map 进行比较

我正在尝试使用 eBPF 映射,但在“if”子句中使用从 eBPF 映射中检索到的值时遇到问题。

我也在使用密件抄送来试验这段代码!

所以,当我运行代码时,我尝试这样做:

我在运行代码后检查了 1234 是否已正确插入。

当我尝试从 eBPF 映射中读取值并使用“if”进行比较时,它给了我一个错误,例如:

这给了我一个错误,例如:

我认为我正在做合法的操作,只是从 eBPF 映射中读取值并将其与内核空间中的另一个值进行比较,但这似乎不起作用。

0 投票
1 回答
644 浏览

debugging - 如何使用 BPF (BCC) 跟踪 go 函数

我有一些代码(myclient)。它看起来像这样(这里只有 mypackage 是相关的):

我跑去go build -o build/myclient cmd/myclient/main.go获取二进制文件。

现在这个二进制文件被其他一些 go 程序使用并被加载。

不知何故像这样:

现在我尝试使用 BCC 工具进行跟踪/调试。原因是生产中发生了一些奇怪的错误,查看上面函数的参数和返回值很重要。我受到了启发:http ://www.brendangregg.com/blog/2017-01-31/golang-bcc-bpf-function-tracing.html

使用时,funccount我在这里看到了这个(在通过调用 some-prog 调用函数之后)

但是当我尝试使用trace(或gotrace)时,它看起来像这样:

是否有可能使用 BCC 工具或 eBPF/(bpftrace?) 跟踪这样的 go-function(特别是检查结构参数和返回值)(不添加任何代码)

0 投票
1 回答
287 浏览

linux - bpftrace:uprobe 目标文件不存在或不可执行

我想使用 bpftrace 来跟踪 libasan 库中的函数,该库位于 /usr/lib/x86_64-linux-gnu/ 中。

然而

sudo bpftrace -e 'uretprobe:/usr/lib/x86_64-linux-gnu/libasan.so.4: __interceptor_malloc { printf("pid: %d, malloc %p\n", pid, retval); }'

给出错误:uprobe target file '/usr/lib/x86_64-linux-gnu/libasan.so.4' does not exist or is not executable

我试过了:export LD_LIBRARY_PATH="/lib:/usr/lib:/usr/local/lib"但它没有帮助。

如何使库可执行 bpftrace?我需要它来跟踪在 Firefox 进程中完成的分配。谢谢!

编辑:我刚刚发现对 libasan 的权限是 -rw-r--r--,这意味着它确实是不可执行的。我应该如何使它可执行?

0 投票
0 回答
115 浏览

go - 用于编译内联函数的 EBPF 探针

我想为 Golang 创建一个 EBPF 程序,记录输入和返回函数的时间。

我有一些问题:

  • A. 函数是内联的。
  • B. 闭包是匿名的。
  • C. 阅读 Golang 结构。

问题:

一个。

在我的情况下,它不可能阻止函数内联go build -gcflags '-l.

如果我可以在二进制文件中识别内联函数的指令,我可以在它上面放置一个探针(而不是“在函数 X 上放置探针”,我可以告诉 EBPF “在指令 X 处放置探针”吗?)。

B.

我可以对匿名闭包做同样的事情吗?

C。

如何在 EBPF C 程序中读取 Golang 结构?

我想提取属于结构层次结构的标量值。我可以找到所有将标量而不是结构作为参数的探测函数的示例。

有关的

谢谢。

0 投票
1 回答
189 浏览

bpf - eBPF 数据包过滤器没有给我正确的数据

因此,我一直在尝试查看是否可以将 eBPF 数据包过滤器附加到网络接口 enp32s0np1。我正在尝试捕获所有传入的发件人 IP 地址。然而,运行下面的代码给了我奇怪的反应。我没有看到发件人 IP 地址,而是看到了一些随机数。

这是代码:

结果如下:

0 投票
1 回答
501 浏览

python - 如何删除 skb_buff 使用 ebpf/bcc?

我正在运行 bcc 示例/http_filter/http-parse-simple.c,其中有一条评论说明:

当我运行这个例子时,我看到当我运行一个 UDP 数据包(例如 dig)或 icmp 数据包(ping)时,用户程序员确实没有收到数据包。

但是 ping 或 dig 程序不会丢失。

据我了解,这些非 TCP 数据包应该被丢弃(我希望 ping 或 dig 会失败),但事实并非如此。

那么是什么原因呢?

还有其他方法可以放弃 skb_buff 使用 ebpf/bcc 吗?

0 投票
1 回答
421 浏览

bpf - eBPF 的 perf_submit() 也可以在 socket_filter 程序中使用吗?

所以我试图使用 perf_submit 将一些数据从内核空间程序发送到用户空间程序。

我已经做了一些研究,在这里(https://github.com/iovisor/bcc/issues/2423),yonghong-song回答(最后一条评论)socket_filter 程序无法访问 bpf_perf_event_output 帮助程序,因此它只能是用于跟踪程序类型。

但是,在 BCC 参考站点(https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md#2-bpf_perf_output)上,如果您 ctrl+f 并搜索: 3. perf_submit() ,它在第五行说“对于 SOCKET_FILTER 程序,必须使用 struct __sk_buff *skb。” 我相信这推断 perf_submit() 也可以用于 socket_filter 程序?

所以我很难弄清楚 perf_submit() 是否确实可以用于套接字过滤程序。可能是因为宋永红回答了上面的问题,增加了一些功能?

我正在检查 perf_submit() 是否可以与套接字过滤器一起使用,并且实际上并没有一行代码可以获取 perf_submit 输出的数据,因为内核程序中的 addint perf_submit() 已经省略了一个错误。

这是我的程序的代码:

这是错误代码:

0 投票
1 回答
405 浏览

bpf - eBPF 数据包监视器在“ping -f”时丢失了一些数据包

我编写了这个程序来捕获进入我的网络接口的所有数据包。它似乎适用于 ping [IP] 之类的东西。ping -f [IP] -c 10 也可以正常工作。但是,当被 ping 的数据包数量增加到 200 个时,程序会丢失一些数据包。这是 eBPF 的自然限制还是我做错了什么?这是代码:

此外,当我 ping -f [IP] -c 500 时,它还会输出:“可能丢失 10 个样本”或“可能丢失 34 个样本”

0 投票
1 回答
69 浏览

ebpf - 无法使用 eBPF 跟踪某些系统调用

我正在使用 bcc 来跟踪多个系统调用,为什么我可以使用简单但无法跟踪系统调用,例如,write跟踪系统调用?closefchownattach_kprobestatfstat

我认为这是我无法追踪但还没有找到哪些系统调用。我如何追踪statfstat这些与平常有何write不同close

示例代码:

在我的编中,我做了一个简单的打印

0 投票
1 回答
467 浏览

bpf - BPF 中 cursor_advance 的具体用法是什么?

我正在浏览 IOvisor 项目的幻灯片,https: //events.static.linuxfound.org/sites/events/files/slides/iovisor-lc-bof-2016.pdf

此代码是示例之一。我一直在使用cursor_advance(),现在我试图弄清楚它到底是做什么的。我怀疑这cursor是我们保存正在解析的数据包地址的指针。然后,cursor_advance()我们将光标移动以太网标头的大小,因为ethernet_t包含所有以太网标头信息。然后,光标现在位于数据包以太网标头末尾的地址,如果我们使用ethernet_t标头中声明的变量,例如type: ethernet->type,我们可以访问保存在的信息,type因为结构ethernet会读取保存在的值那个地址?对不起,我的解释不是很好。我只是在寻找一般解释,或者我的理论是否正确。谢谢!