Kprobe 和 Uprobe 如何在可执行文件中插入调试 prinkk -- 它们是否扩展了运行模块或程序的地址空间

问题描述

我简直无法理解调试器和探测工具的想法。

在运行的内核模块或用户空间应用程序中插入调试 printk 语句在技术上如何可能——使用 kprobe 和 Uprobe。用什么术语来定义 kprobe 和 Uprobe 在内存方面的行为——如何在程序运行状态下扩展地址空间。

解决方法

通常有导致断点(软件中断)的单字节指令,然后处理器中也有一些调试寄存器。

有了这些,就可以在不扩展任何“内存空间”的情况下插入一个跳转到内存中任何位置的内核陷阱处理程序的陷阱——您只需设置调试寄存器或在断点处用该陷阱指令替换所需的指令。>

在内核陷阱处理程序中,内核会知道错误发生的确切地址,从而检查寄存器的状态等等。如果是单字节指令左右的陷阱,您可以用原始指令替换陷阱指令;可能使用处理器技巧来单步执行;然后再次用trap指令替换...