Part1 探针的原理及应用
这篇文章先容的探针像调试措施时辰打断点一样,只不外打断点是有交互的,同时是以字节码情势运行在内核假造机(BPF)中的。 一、非常 非常(exception) 就是节制流中的突变,用来相应处理赏罚器状态中的某些变革。领略非常有助于领略探针技能。下图 所示处理赏罚器在执行时执行时,产生了一个重要的变革,我们把它称为变乱(event)。变乱也许与当前指令直接相干,如缺页非常,算术溢出,实行除以 0 。也有也许无关如按时器发生信号,I/O 完成。在任何环境下处理赏罚器通过非常表举办一个间接进程挪用到专门的非常处理赏罚措施来处理赏罚。 非常可以分成四类: 间断(interrupt), 陷阱(trap),妨碍(fault)和终止(abort)。 间断是异步产生的,是来自处理赏罚器外部 I/O (鼠标,键盘,网卡等)装备信号的功效。 硬件间断不是由任何一条专门的指令造成,从这个意义讲它是异步的。剩下的非常范例(陷阱,妨碍,终止)是同步产生的,是执行当前指令的功效。我们把这种指令称为妨碍指令。 陷阱是故意的非常,是措施员“主动”触发的,就像是本身在代码埋下一个陷阱一样。 陷阱最常见的用户是历程提倡体系挪用,通过 INT 从用户态 trap 进内核态。 妨碍由错误环境引起,可以或许被妨碍处理赏罚措施批改。 当妨碍产生时,处理赏罚器讲节制转移给妨碍处理赏罚措施。譬喻当缺页非常产生时,妨碍处理赏罚措施可以从磁盘中间对应的页 swap 进物理内存。 终止,是不行规复的致命错误造成的功效,凡是是一些硬件错误。 措施员泛泛调试代码时,给措施添加断点,让措施在我们想要的处所愣住。调试器可以或许为所欲为节制措施运行,首要靠软件间断。软件断点在 X86 体系中就是指令 INT 3。当措施执行到 INT 3 指令时,会激发软件间断。这就是上文提到的陷阱。差异于我们在 Visual Studio 和 GDB 中交互式的断点,假如措施在 trap 产生时,自动执行预界说和 handle 记录和统计运行环境,不影响措施的正常运行,到达调查 MySQL 的目标。 二、探针为了捕获措施运行环境,我们在措施中配置一些 “ 陷阱 ”,并配置处理赏罚措施,我们称之为探针。有的探针是在代码中预界说的,有的是在运行时动态添加的。 1. 静态探针 静态探针是事先在措施中界说好,并编译到措施可能内核的探针。 静态探针只有被开启时才会运行,不开启就不会运行,常见的静态探针包罗内核中的跟踪点(tracepoints)和 USDT(Userland Statically Defined Tracing)探针。tracepoints 在代码中埋下钩子,在运行时挪用相毗连的探针。 它有“打开”(已毗连探针)和“封锁”(未毗连探针)两种状态。 当跟踪点处于“封锁”状态时,它没有任何浸染,只增进细小的时刻丧失(搜查分支的前提)和空间丧失。当跟踪点为“ 打开”时,每次在挪用者的执行上下文中执行跟踪点时,城市挪用相毗连的探针。探针函数执行完后,将返回到挪用方。USDT和tracepoint相同,只不外是用户态的,在代码中插入DTRACE_PROBE()即可。 2. 动态探针 动态探针是应用措施没有界说,在措施运行时动态添加的探针。 动态探针相同于非常处理赏罚机制,当体系发生一个非常,就会跳转去执行对应的 handle。动态探针会在函数进口和出口插入一些断点,措施执行到断点时辰会去执行对应的 handle,从而到达视察应用措施的目标。这里的间断是指 trap(陷阱),在X86系统是int3指令。 KProbes 是 Linux 内核探针,可以用于监督出产体系中的变乱。您可以行使它来办理机能瓶颈,记录特定变乱,跟踪题目等。 KProbes 能及时在内核代码中插入间断指令,固然这听上去有点不行思议,现实上 KProbes 做了许多安详性担保,譬喻 stop_machine 用于确保其他CPU在被修改时遏制执行。 现实上 kprobes 最大风险是给一些挪用异常频仍的函数加上探针,如在收集模块中,频仍间断也许造成必然的机能风险。KProbe必要界说 pre-handler 和 post-handler,当被探测的指令要被执行时,先执行pre-handler措施。同样,当被探测指令执行之后当即执行post-handler。 uprobes 是Linux提供用户态的动态探针,归并于2012年7月宣布的 Linux 3.5 内核中。uprobes 和 kprobes 异常相似,用于用户态。 三、BPFBPF(Berkeley Packet Filter) 最早开拓在 BSD 操纵体系中,是 TCP/IP 包过滤的家产标注,被 tcpdump 行使。 它的事变要领有点出格: 用户自界说包过滤表达式,然后注入内核中的 BPF 中运行 ,这样的甜头就是在内核举办过滤而不是将包拷贝到用户态,停止大量数据从内核态拷贝到用户态,因此具有较好的机能。 其后呈现了eBPF(extend BPF), eBPF 有本身的说话,用户本身编写措施编译后通过 BPF 挪用注入到内核的 BPF 假造机中运行,可以安详会见内核内存,它使得内核酿成可编程。运行在内核中由于不必要把数据拷贝到用户空间每每具有较量高的机能,因此 BPF 被许多机能追踪器材行使。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |