如果kprobe 模块定义了pre_handler()回调,那么调用pre_handler()回调函数。 设置单步调试模式。 从上面的分析可以知道,在do_int3()异常处理例程中调用了 kprobe 模块的pre_handler()回调函数,但post_handler()回调函数在什么地方调用呢? 我们知道,kprobe 模块的post_handler()回调函数是在被跟踪指令执行完后被调用...
pre_handler:在探测点处的指令执行前,被调用的调试函数。 post_handler:在探测点处的指令执行后,被调用的调试函数。 fault_handler:在执行 pre_handler、post_handler 或单步执行被探测指令时出现内存异常,则会调用这个回调函数。 一个kprobe 探测点的执行过程如下图所示: 从上面的介绍可知,kprobe 一般用于调试内核...
首先kprobe是最基本的探测方式,是实现后两种的基础,它可以在任意的位置放置探测点(就连函数内部的某条指令处也可以),它提供了探测点的调用前、调用后和内存访问出错3种回调方式,分别是pre_handler、post_handler和fault_handler,其中pre_handler函数将在被探测指令被执行前回调,post_handler会在被探测指令执行完毕后回...
如果kprobe 模块定义了 pre_handler 回调,那么调用 pre_handler 回调函数。 设置单步调试模式。 从上面的分析可以知道,在 do_int3 异常处理例程中调用了 kprobe 模块的 pre_handler 回调函数,但 post_handler 回调函数在什么地方调用呢? 我们知道,kprobe 模块的 post_handler 回调函数是在被跟踪指令执行完后被调用...
_pre_handler_t pre_handler:在被探测点指令执行之前调用的回调函数;kprobe_post_handler_t post_handler:在被探测指令执行之后调用的回调函数;kprobe_fault_handler_t fault_handler:在执行pre_handler、post_handler或单步执行被探测指令时出现内存异常则会调用该回调函数;kprobe_break_handler_t break_handler:在...
kprobe异常处理函数会根据发生异常的地址来找到对应的kprobe(kprobe的addr域记录着地址),执行kprobe的pre_handler函数,然后设置single-step相关的寄存器,为下一步执行原指令时发生single-step异常作准备。那么紧接着就是设置原指令的地址了,我们知道0xffffffc000162914处已经被替换成了BRK指令,原指令保存在kprobe结构体中...
3)在kprobe的异常出来函数中,判断是否存在pre_handler钩子,存在则执行; 4)执行完后,准备进入单步调试,通过设置EFLAGS中的TF标志位,并且把异常返回的地址修改为保存的原指令码; 5)代码返回,执行原有指令,执行结束后触发单步异常; 6)在单步异常的处理中,清除单步标志,执行post_handler流程,并最终返回; ...
kprobe_pre_handler_tpre_handler:在被探测点指令执行之前调用的回调函数;kprobe_post_handler_tpost_handler:在被探测指令执行之后调用的回调函数;kprobe_fault_handler_tfault_handler:在执行pre_handler、post_handler或单步执行被探测指令时出现内存异常则会调用该回调函数;kprobe_break_handler_tbreak_handler:在执行...
步骤2),3),4)便是一次kprobe工作的过程,它的一个基本思路就是将本来执行一条指令扩展成执行kprobe->pre_handler ---> 指令 ---> kprobe-->post_hander这样三个过程。下面详细解释每个过程: 指令替换过程: 上图中蓝色区域表示内存,红色标明了地址,绿色部分代表一条指令,上图的意思是,内存0xfffffc000162914处...
首先kprobe是最基本的探测方式,是实现后两种的基础,它可以在任意的位置放置探测点(就连函数内部的某条指令处也可以),它提供了探测点的调用前、调用后和内存访问出错3种回调方式,分别是pre_handler、post_handler和fault_handler,其中pre_handler函数将在被探测指令被执行前回调,post_handler会在被探测指令执行完毕后...