调试器原理:
调试器是一个程序,在开发工具中也是调用一个程序,在运行时就是一个进程,这个进程与普通进程没有区别,只是这个进程调用了内核的一些特殊函数(系统调用)来操纵内核数据,这些数据就是被调试进程的内存数据。
而对操作系统调试的调试器则不同,因为没有操作系统的支持,调试器本身就不再需要调用操作系统内核的程序来支持,但是此时的调试非常特殊,因为操作系统自己有中断处理程序,调试器对中断服务程序的劫持会让操作系统的操作变得有些不同,调试器首先启动先设置CPU为单步执行状态,然后启动操作系统的代码,每执行一条指令,CPU均产生中断进入调试器程序(中断服务程序)。
通常内核调试紧紧是通过输出信息(如printk)来调试,这其实已经不是调试,而是嵌入代码进行测试,即使是kgdb也是在内核中插入了代码来实现调试,如让windows运行时启动调试模式,那么其内核中的调试代码就起作用了,这些调试是内核设计者预先设计好的。
在操作系统下调试程序,只是调试用户态代码,而用户态代码是出于操作系统控制之下的,因此调试就是借助操作系统来操作目标进程。
无论windows还是unix中,都是通过对系统调用的劫持来实现对目标程序的调试的,如果操作系统内核不实现对程序的调试功能,那么调试器是不可能实现对另一个进程控制的。调试器通过创建子进程,并告诉操作系统(创建进程的状态设置)自己要对子进程进行调试,那么操作系统装载目标程序时,如果发生了规定的事件,就会停止目标进程的执行,此时对于目标进程来说&