断点分为软件断点和硬件断点。
软件断点
软件断点在X86系统中为中断指令INT 3,其二进制代码opcode是0xCC。当程序执行到INT 3指令时,会引发软件中断。操作系统的INT 3中断处理器会寻找注册在该进程上的调试处理程序。从而像Windbg和VS等等调试器就有了上下其手的机会。程序出错时常看到的”烫烫烫“、”锟斤拷“、”屯屯屯“等与这个终端指令有关。软件断点没有数目限制。
一般情况下,调试器维护了一大组调试断点:
- 在加断点行所在的机器代码的第一个字节换成INT3,并把他们都换成了INT3。
- 在抵达断点后,INT3会被还原成原来的操作符,调试器通过现在的地址判断是到了哪个断点。
硬件断点
X86系统提供8个调试寄存器(DR0~DR7)和2个MSR用于硬件调试。其中前四个DR0~DR3是硬件断点寄存器,可以放入内存地址或者IO地址,还可以设置为执行、修改等条件。CPU在执行的到这里并满足条件会自动停下来。硬件断点十分强大,但缺点是只有四个,这也是为什么所有调试器的硬件断点只能设置4个原因。我们在调试不能修改的ROM时,只能选择这个,所以要省着点用,在一般情况下还是尽量选择软件断点。
参考链接:https://zhuanlan.zhihu.com/p/34003929
面试案例:https://www.nowcoder.com/discuss/224420