破点如何运作?

时间:2015-09-09 14:32:39

标签: c debugging

在genral我知道断点的用法,但想知道它究竟是如何工作的?它如何能够中断执行代码?它如何为可执行代码提供用户界面(断点)以及为什么它通常只允许6个断点。

谢谢!

1 个答案:

答案 0 :(得分:14)

调试器通常可以设置两种不同的断点:软件断点和硬件断点。

软件断点包括用“break”指令替换目标地址处的指令(例如x86上的int 3)并等待CPU执行它。当该指令被命中时,CPU引发异常并将控制转移到调试器。好处是您可以根据需要定义多个断点,但缺点是这需要修改内存中的程序(这对于只读内存中的程序可能是不可能的,或者可能导致程序的行为不同,如果它读取自己的程序存储器。)

另一种硬件断点包括在CPU中设置一个特殊的调试寄存器,要求它在到达指定地址时中断。当程序计数器到达该地址时,CPU将自动引发异常。好处是不需要软件修改,但缺点是这依赖于有限的资源(调试寄存器),其中可能没有很多。例如,x86处理器通常只有4个调试地址寄存器,因此一次只能设置4个硬件断点。

调试器通常根据可用资源选择策略(例如,前4个断点的硬件断点和其后的软件断点),尽管许多也可以配置为强制使用一种特定类型的断点。例如,流行的调试器GDB具有hbreak命令来显式创建硬件断点。