kprobes和kretprobes都允许您在内核地址中的特定指令上进行探测。
如果注册了kprobe,则pre_handler在实际函数之前执行,而post_handler在实际函数之后执行
使用kretprobes,您可以让entry_handler在实际函数之前执行,而ret_handler在实际函数之后执行,并且其中包含函数调用的返回值。
因此,与kretprobes相比,使用kprobes有什么优势,因为kretprobes具有kprobes的功能加上函数的返回值
答案 0 :(得分:2)
可以将kprobe放置在任何指令上,而不仅可以放置在内核函数开始处(当然,如果给定的内核代码中允许使用kprobes)。 kprobe的处理程序在指令之前和之后运行。
Kretprobes仅对探测函数入口和出口有意义。 kretprobe的处理程序在函数的入口和出口处运行,而不是像kprobe处理程序那样在某些指令之前和之后运行。
此外,如果您不需要在函数出口处运行代码,则kprobes可能比kretprobes更适合探测函数(尽管Ftrace可能更好)。 Kretprobes与函数在栈上的返回地址混为一谈,以使处理程序执行。如果函数由于其他原因而崩溃或转回回溯跟踪,则回溯跟踪可能包含kretprobe内部地址而不是实际的返回地址,这可能会造成混淆。