我们知道用调试器硬件,可以单步调试软件的运行,但是操作系统中,不需要调试器硬件支持,就可以单步调试应用软件的运行,这是怎么做到的呢?也就是OS内核怎么就能控制应用程序一步步执行呢?

其实很简单,示意图如下:

系统gdb内核调试应用程序断点单步执行调试原理_应用程序

当我们想要调试时候,会把断点信息发送给系统内核的调试线程,它会把我们要调试的应用程序的断点所在地址的指令替换成OS自己的线程挂起函数,这样每次执行到断点,该程序就会被OS挂起,因此,可以查看该应用程序的堆栈各种变量信息了,调试完成后,又会把该断点处的指令恢复为原来的指令,这样就实现了OS可以控制应用程序单步执行啦。有没有一种很巧妙的感觉。

这个在Linux内核的pTrace内核调试进程,就是这个原理,而gdb调试的基础就是这个 pTrace内核进程。

因此,我们也可以直接实现一个软件调试器啦。但是,如果我们想要调试OS内核本身,那就没办法了,只能是用硬件调试器了。这个在嵌入式开发中,很常见的。