问题标签 [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.
android - 在 Android/ARM 上注销 jprobes 时出现内核错误
我为我的 Nexus 5 编写了一个内核模块(参见下面的代码),以通过 kprobes 跟踪一些系统调用(我已经构建了一个为此启用了 kprobes 的自定义内核)。
有时,通过rmmod
我的手机卸载模块时会冻结并重新启动。试图找出错误的根本原因,现在在我的模块中,除了为系统调用 do_fork 注册 jprobe 的代码(但其他探测函数也发生错误)并在卸载时取消注册它(所以,我认为它是可能是 ARM 上的 kprobes 错误,而不是 Android 特定问题)。也许任何人都可以指出 kprobes 中的一个已知错误?
关于内核恐慌的日志告诉我一些分页问题Unable to handle kernel paging request at virtual address c0193a2c
,c0193a2c
实际上是do_fork
.
/proc/last_kmsg
这是我的 Nexus 5 上cat 的输出:
linux - 如何调用任何内核函数?
我知道 Kprobes 可以用来探测任何内核函数。但是看了它的文档后,我意识到它主要是一种被动实体。它只是将一个探针放在执行序列的中间。
但是,如果我想直接调用任何内核函数而不用担心执行顺序怎么办。
我怎样才能做到这一点?
更新:
注意:我想在我的内核模块中调用任何内核函数,而不是从任何用户空间应用程序中调用。
linux - Kprobe:将返回探针与入口探针关联
我想跟踪对特定文件的写入,所以我想我可以这样做:
我在 上创建一个探针do_sys_open
,如果filename
参数与我正在寻找的模式匹配,我使用触发器来启用一个返回探针,该探针会获取返回的文件描述符 id(它是$retval
)。这个返回探针将对 有一个过滤器,common_pid
因为我只对刚刚打开我要监视的调用fd
返回的 s感兴趣。返回探针采用并启用另一个探针,并在 和 上使用过滤器。我希望这样我就可以只跟踪我正在监视的一个文件上的操作。do_sys_open
filename
fd
sys_write
common_pid
fd
write
问题是这不适用于多线程进程。如果一个进程同时调用open
两次(使用两个线程),上述机制可能会失败。现在我正在尝试找出一种方法来在入口do_sys_open
和返回探测之间建立这种关联do_sys_open
,我会很高兴有任何建议。
PS:我不确定这个问题是属于 stackoverflow 还是 unix & linux。
c - 错误:“struct pt_regs”没有名为“eip”的成员
我按照这个文档:http : //www-users.cs.umn.edu/~boutcher/kprobes/kprobes.txt.html 来了解kprobe。
如文档中所述,我创建了 kprobe_example.c 和 Makefile。(这两个文件的代码都在文档中给出。我做了一个复制粘贴,没有别的)
当我使用“make”命令编译 Makefile 时,我收到了这个错误:
我还在 kprobe_example.c 中包含了 ptrace.h 头文件,但我仍然无法解决该错误。非常感谢您对此的任何帮助。
c - insmod:错误:无法插入模块 kprobe_example.ko:不允许操作
我指的是: http : //www-users.cs.umn.edu/~boutcher/kprobes/kprobes.txt.html 来了解kprobe。我使用了文档中给出的 kprobe_example.c。
我使用 makefile 编译它(代码取自同一个文档)
我收到编译错误,因为我的内核版本是 4.2,并且 struct pt_regs 中的某些字段已更改。因此,我将 eip 替换为 ip 并将 eflag 替换为 kprobe_example.c 中的标志,即https://gist.github.com/murlee417/87c2eb43a6afa1954b05404a07813e81。然后我能够成功编译它。
现在,作为 root 用户,我做了:
我得到了:
我的消息缓冲区有:
请帮助我解决此错误并使 insmod 工作。
linux - linux内核中kprobe机制的一个谜题
根据 linux 内核中的kprobe.txt,当我阅读 linux 内核的源代码以满足工作需要时,我对 kprobe 的工作方式有一个疑惑:
1.1 Kprobe 是如何工作的?
当 kprobe 被注册时,Kprobes 会复制被探测的指令,并用断点指令(例如,i386 和 x86_64 上的 int3)替换被探测指令的第一个字节。
当 CPU 遇到断点指令时,会发生陷阱,保存 CPU 的寄存器,并通过 notifier_call_chain 机制将控制权传递给 Kprobes。Kprobes 执行与 kprobe 关联的“pre_handler”,向处理程序传递 kprobe 结构的地址和保存的寄存器。
接下来,Kprobes 单步执行其探测指令的副本。(单步执行实际指令会更简单,但 Kprobes 将不得不暂时删除断点指令。这将打开一个小的时间窗口,此时另一个 CPU 可以直接越过探测点。)
在指令单步执行后,Kprobes 执行与 kprobe 相关联的“post_handler”(如果有)。然后继续执行探测点之后的指令。
给出了三个步骤,但为什么需要single
andpost_handler
过程?我的意思是在用断点指令替换原始指令后,处理器被困在执行 中pre-handler
,为什么不直接将原始指令复制回 pc 减 1pre-handler
并恢复中断上下文?
请给个提示。
为了清楚起见,请参阅此处的图表。
c - 为什么 _do_fork() 的 kretprobe 只返回一次?
当我用 fork 编写一个小脚本时,系统调用返回两个进程(每个进程一次):
如果我使用 systemtap 进行检测,我只会找到一个返回值:
(SystemTap 安装探针_do_fork
而不是克隆,但这不应该改变任何东西。)
这让我很困惑。几个相关的问题:
- 为什么系统调用只返回一次?
- 如果我正确理解了
_do_fork
代码,该过程将被克隆到函数的中间。(copy_process
和wake_up_new_task
)。后续代码不应该在两个进程中运行吗? - 系统调用之后的内核代码是否与系统调用之前的用户代码在同一线程/进程中运行?
kprobe - 使用 kprobes 更改内核执行路径
是否可以使用 kprobe 更改执行路径并终止内核函数执行?在搜索时,我遇到了这篇文章Replace system call in linux kernel 3 AFAIK,可以使用 kretprobe 更改返回值,但我正在寻找的是有条件地从 kprobe 处理程序中终止内核函数执行。这个以前试过吗?谢谢!
linux - 为什么 kprobe 不能探测内核中的某些函数?
我试图探测我在内核中添加的一个简单函数(例如 myfunc),如下所示:
~/source/kernel/
我在ie下创建了一个文件(myfile.c)~/source/kernel/myfile.c
- 我在这个文件中
添加了一个简单的系统调用
mysyscall
和一个本地函数。函数调用函数。myfunc
mysyscall
myfunc
我可以使用获取函数的地址
但是当我调用 myfunc 时不会调用 kprobe 处理程序。
我可以探测系统调用“mysyscall”。但是当我尝试探测“myfunc”时,处理程序不会被调用。
谁能解释为什么这是这种行为?谢谢。
正如 Eugene 所问,下面是 kprobe 和 mysyscall 和 myfunc 的代码。在以下代码中未调用 kprobe 处理程序。但是,如果我在下面给出的 kprobe 代码中取消注释 B 行并注释 A,则调用 kprobe 处理程序。
我使用的是内核版本 4.8。我添加了 ~/source/kernel/myfile.c 来编写 mysyscall 和 myfunc ,如下所示:
kprobe 模块代码如下:
我使用内核模块调用 mysyscall,如下所示:
linux-kernel - kprobes 支持 ftrace 后,Linux 内核中的跟踪点是否冗余?
当 Linux 内核中提供对 ftrace 的 kprobe 事件支持时,使用跟踪点事件的用例是什么?似乎使用“跟踪点事件”可以完成的所有事情都可以使用 kprobe 事件来完成,因为可以将 kprobe 事件设置到跟踪点事件可用的同一点。
我错过了什么吗?