问题标签 [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.
ebpf - 在内核空间中使用 eBPF map 进行比较
我正在尝试使用 eBPF 映射,但在“if”子句中使用从 eBPF 映射中检索到的值时遇到问题。
我也在使用密件抄送来试验这段代码!
所以,当我运行代码时,我尝试这样做:
我在运行代码后检查了 1234 是否已正确插入。
当我尝试从 eBPF 映射中读取值并使用“if”进行比较时,它给了我一个错误,例如:
这给了我一个错误,例如:
我认为我正在做合法的操作,只是从 eBPF 映射中读取值并将其与内核空间中的另一个值进行比较,但这似乎不起作用。
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(特别是检查结构参数和返回值)(不添加任何代码)
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--,这意味着它确实是不可执行的。我应该如何使它可执行?
go - 用于编译内联函数的 EBPF 探针
我想为 Golang 创建一个 EBPF 程序,记录输入和返回函数的时间。
我有一些问题:
- A. 函数是内联的。
- B. 闭包是匿名的。
- C. 阅读 Golang 结构。
问题:
一个。
在我的情况下,它不可能阻止函数内联go build -gcflags '-l
.
如果我可以在二进制文件中识别内联函数的指令,我可以在它上面放置一个探针(而不是“在函数 X 上放置探针”,我可以告诉 EBPF “在指令 X 处放置探针”吗?)。
B.
我可以对匿名闭包做同样的事情吗?
C。
如何在 EBPF C 程序中读取 Golang 结构?
我想提取属于结构层次结构的标量值。我可以找到所有将标量而不是结构作为参数的探测函数的示例。
有关的
- 无法使用密件抄送工具将 eBPF `kretprobes` 附加到 `napi_poll()`
- http://www.brendangregg.com/blog/2017-01-31/golang-bcc-bpf-function-tracing.html
谢谢。
bpf - eBPF 数据包过滤器没有给我正确的数据
因此,我一直在尝试查看是否可以将 eBPF 数据包过滤器附加到网络接口 enp32s0np1。我正在尝试捕获所有传入的发件人 IP 地址。然而,运行下面的代码给了我奇怪的反应。我没有看到发件人 IP 地址,而是看到了一些随机数。
这是代码:
结果如下:
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 吗?
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() 已经省略了一个错误。
这是我的程序的代码:
这是错误代码:
bpf - eBPF 数据包监视器在“ping -f”时丢失了一些数据包
我编写了这个程序来捕获进入我的网络接口的所有数据包。它似乎适用于 ping [IP] 之类的东西。ping -f [IP] -c 10 也可以正常工作。但是,当被 ping 的数据包数量增加到 200 个时,程序会丢失一些数据包。这是 eBPF 的自然限制还是我做错了什么?这是代码:
此外,当我 ping -f [IP] -c 500 时,它还会输出:“可能丢失 10 个样本”或“可能丢失 34 个样本”
ebpf - 无法使用 eBPF 跟踪某些系统调用
我正在使用 bcc 来跟踪多个系统调用,为什么我可以使用简单但无法跟踪系统调用,例如,write
跟踪系统调用?close
fchown
attach_kprobe
stat
fstat
我认为这是我无法追踪但还没有找到哪些系统调用。我如何追踪stat
,fstat
这些与平常有何write
不同close
?
示例代码:
在我的编中,我做了一个简单的打印
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
会读取保存在的值那个地址?对不起,我的解释不是很好。我只是在寻找一般解释,或者我的理论是否正确。谢谢!