调试(设置断点的原理是什么?)
对于程序员来说,调试的时间往往比写程序的时间还要长。尤其是对于我这种主要写bug的程序员来说,一个好的调试器就意味着早点下班休息。现在有很多方便的调试器,包括著名的IDE如Visual Studio(VS),免费的Windbg和GDB等。添加断点也很简单,按一个键就行。但是你有没有想过调试器无法控制程序的执行顺序?为什么它能在需要的地方停止CPU?
今天我们就来揭开调试断点的神秘面纱,通过一个例子来看看调试器到底做了什么。调试器可以随意停止程序的执行,主要通过软件断点和硬件断点。
软件断点是X86系统中的指令INT 3,其二进制代码操作码是0xCC。当程序执行INT 3指令时,会引起软件中断。操作系统的INT 3中断处理程序将寻找在这个进程上注册的调试处理程序。因此像Windbg和VS这样的调试器有机会作弊。
让我们首先通过一个例子来看看调试器做了什么:
#includeintmain(){//Thislooptakessometimesothatwe//getachancetoexaminetheaddressof//thebreakpointatthesecondprintffor(inti=1;i