问题标签 [kprobe]
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.
kernel - sys/kernel/debug/krpobes/list 为空
为了工具的目的,我正在尝试附加到 kprobe 事件,但我对 kprobe 事件不太熟悉。我读过注册的 kprobes 列表可用,/sys/kernel/debug/kprobes/list
但是sudo less /sys/kernel/debug/krpobes/list
显示没有注册的 kprobes。我已经确认 krpobes/enabled 是 1。我做错了什么吗?
trace - 将 bpf 附加到 sys_enter(可通过 /proc/kallsyms 获得跟踪点)
我正在尝试构建一个工具,其中我将 BPF 程序附加到所有系统调用的入口点。在 CLI 中,我能够通过附加到所有系统调用条目
这很棒,但我想做更复杂的事情。我发现我可以使用 python 的前端将 BPF 程序附加到 kprobe 事件中——
但是,在 attach_kprobe 行中,我想附加到所有系统调用条目而不是 sys_clone。但是,我没有找到任何 sys_enter 跟踪点,/sys/kernel/debug/tracing/available_filter_functions
但我在/proc/kallsyms
. 但是,当我尝试用 __tracepoint_sys_enter 替换 __x64_sys_clone 时,我得到一个无效的参数错误。我想知道,我可以使用 kprobes 附加到所有系统调用条目(并最终退出)吗?还是我需要使用不同的跟踪机制。谢谢!
linux - 如何将 /kernel/sched/* 包含到 BPF 程序中?
根据 BPF Performance Tools 一书,我正在尝试在 Linux 中使用 bpftrace 制作一个自定义 bpf 程序。我试图从路径 linux/kernel/sched/sched.h 中包含一些文件。我怎样才能包括它们?(不仅是 /include 文件夹,还来自 Linux 中的 linux/kernel/* 文件夹?)
我正在尝试合并#include /kernel/sched/sched.h 以使用“struct rq”。
我的程序示例是:
ebpf - eBPF 工具 - skb_network_header 在 BPF 内核跟踪函数中崩溃
我正在寻找追踪ip_forward_finish
。目的是跟踪通过基于 linux 的网关路由器的所有 TCP 连接的延迟。因此想到了跟踪ip_forward_finish
核函数。并在路由器上捕获SYN
,SYN-ACK
和消息的时间戳。ACK
问题是iphdr
在跟踪函数内部访问使验证者抱怨以下错误:
我最初拥有的代码片段如下,当访问时发生崩溃ip_Hdr->protocol
。而且我还检查了ip_Hdr
它不为空。
根据消息中的提示,我确实尝试更改为bpf_probe_read
但结果仍然相同
任何帮助,将不胜感激。
sockets - 可以从 Linux 内核数据类型“struct sock”中检索套接字的端口吗?
动机
我正在尝试编写一个 bpftrace 程序,以通过挂钩 kprobe 来跟踪套接字何时准备好读取sock_def_readable
。我会得到一个struct sock
检查。我想将它映射回我在用户区创建的套接字。
问题
如何从 a 中恢复端口号struct sock
?
linux - 我正在尝试在自定义 BPF 程序中探索 tcp_synack_timer 的功能,例如 BPF Performance Tools 一书
我想使用上述功能,因为我想使用 struct request_sock_queue 和 struct listen_sock 。有没有办法使用它们(也许是不同的功能)?
首先,我尝试制作一个使用 'tcp_synack_timer'(net/ipv4/tcp_timer.h) 的 BPF 程序转到另一个函数-> 'int_csk_reqsk_queue_prune'(net/ipv4/inet_connection_sock.c),这些都不起作用(我也搜索了这些/sys/kernel/debug/tracing/available_filtered_functions 中的函数来获取'struct listen_sock',然后我最终得到'qlen'(struct listen_sock,它位于'include/net/request_sock.h'中。
以及我尝试的另一个功能:
linux - 与网络相关的 kprobe 在实践中有多不稳定?
我对 BPF 开发领域非常陌生,需要在我的 BPF 程序中使用 kprobes,以便我可以正确检测和收集尝试通过网络发送数据包的进程的 PID。我想用我的用户空间应用程序部署这个 BPF 程序,我的用户空间应用程序在各种 linux 版本和发行版上运行——尽管都是相对较新的。
我知道 kprobe 机制并不是官方稳定的,但是我的程序在实践中出现故障的可能性有多大?我正在挂钩tcp_connect
和ip4_datagram_connect
. 我原以为这些功能在内核版本之间不会有太大变化,所以或多或少地依赖它们应该是安全的吗?还是我有什么误解?
我能否发布一个依赖于这些特定 (tcp/udp) kprobes 的应用程序,而不必过多担心兼容性或稳定性?
c - Linux uprobe 如何处理断点?
据我了解,在 x86 上,在用户指定的位置uprobe
放置一条int3
指令,并在遇到异常时处理该异常,kprobe
在这方面有点类似。
我不明白的是,do_int3()
执行处理程序如何告诉uprobe
它何时被击中。相比之下, forkprobe
有对kprobe_int3_handler
inside的调用do_int3
,所以我的问题是,如何以及在哪里uprobe
注册它的处理程序?
这是do_int3
来自 x86 上的内核 5.7:
tcp - tcp_retransmit_skb 的 kprobe。而不是 tcp_retransmit_skb @tcp_states,我想 kprobe __napi_schedule
在 BPF Performance Tools 一书中,有一个 tcp_retransmit_skb 的 kprobe 实现。我想做同样的事情,但不是 tcp_retransmit_skb @tcp_states,我想kprobe_napi_schedule 并合并 'include/linux/netdevice.h' 的枚举 NAPI_STATE *。上面有我的实现:
当我尝试运行它时,它在我的“状态是”的 printf 中什么也没有显示。
输出是:
tcp - 如何在 kprobe 程序中使用 enum tcp mib 定义?
在这里,我尝试编写一个程序(kprobe)来包含像@tcp_states 这样的枚举tcp mib 在BPF Performance Tools bpftrace 一书中。枚举 tcp mib 位于“/include/uapi/linux/snmp.h”中:
当我尝试运行它时,输出是:
然后我尝试代替 TCP_MIB_MAX 来放置特定的数组位置,例如 5,(我修改了上面的代码):
当我尝试运行它时,输出是:
为什么不显示 TCP mib?并且在输出中什么也不显示?如何正确使用数组来显示@mib?