kprobes 相对于 kretprobes 的优势

md.*_*mal 3 linux debugging linux-kernel

kprobes 和 kretprobes 都允许您将探针放在内核地址中的特定指令上。

如果注册 kprobe,则 pre_handler 在实际函数之前执行,post_handler 在实际函数之后执行

使用kretprobes,您可以让entry_handler在实际函数之前执行,并让ret_handler在实际函数之后执行,并且它包含函数调用的返回值。

那么,使用 kprobes 相对于 kretprobes 的优势是什么,因为 kretprobes 具有 kprobes 的特性加上函数的返回值

Eug*_*ene 5

kprobe 可以放置在任何指令上,而不仅仅是内核函数的开头(当然,如果给定的内核代码中允许使用 kprobe)。kprobe 的处理程序在指令之前和之后运行。

Kretprobes 仅对探测函数入口和出口有意义。kretprobe 的处理程序在函数入口处和退出处运行,而不是像 kprobe 处理程序那样在某些指令之前和之后运行。

此外,如果您不需要在函数出口处运行代码,则对于探测函数,kprobes 可能比 kretprobes 更好(尽管Ftrace可能更好)。Kretprobes 干预堆栈上函数的返回地址以执行处理程序。如果函数因其他原因崩溃或转储回溯,则回溯可能包括 kretprobe 内部地址而不是真正的返回地址,这可能会令人困惑。

https://www.kernel.org/doc/Documentation/kprobes.txt