破点如何运作?

VRU*_*VRU 2 c debugging

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

谢谢!

nne*_*neo 14

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

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

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

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