kprobes和kretprobes都允许您将探针放在内核地址中的特定指令上。
如果注册kprobe,则pre_handler在实际函数之前执行,而post_handler在实际函数之前执行
使用kretprobes,您可以让entry_handler在实际函数之前执行,而ret_handler在实际函数之后执行,它包含函数调用的返回值。
因此,与kretprobes相比,使用kprobes有什么优势,因为kretprobes具有kprobes的功能加上函数的返回值
最佳答案
可以将kprobe放置在任何指令上的上,不仅可以放置在内核函数的开始处的上(当然,如果给定的内核代码中允许使用kprobes)。
kprobe的处理程序在指令之前和之后运行。
Kretprobes仅对探测函数入口和导出有意义。 kretprobe的处理程序在函数的入口处和其导出处运行,而不是像kprobe处理程序那样在某些指令之前和之后运行。
此外,如果您不需要在函数导出处运行代码,则kprobes可能比kretprobes更好地选择函数(尽管Ftrace可能更好)。 Kretprobes与函数在栈上的返回地址混为一谈,以使处理程序执行。如果函数由于其他原因而崩溃或转回回溯跟踪,则回溯跟踪可能包含kretprobe内部地址而不是实际的返回地址,这可能会造成混淆。
https://www.kernel.org/doc/Documentation/kprobes.txt
关于linux - kprobes比kretprobes的优势,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53790851/