Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅关注editing this post一个问题。
4年前关闭。
Improve this question
一般而言,我知道断点的用法,但想知道它是如何工作的?如何中断执行代码?它如何在可执行代码上提供用户界面(断点)以及为什么它通常只允许6个断点。
谢谢!
想改善这个问题吗?更新问题,使其仅关注editing this post一个问题。
4年前关闭。
Improve this question
一般而言,我知道断点的用法,但想知道它是如何工作的?如何中断执行代码?它如何在可执行代码上提供用户界面(断点)以及为什么它通常只允许6个断点。
谢谢!
最佳答案
调试器通常可以设置两种不同的断点:软件断点和硬件断点。
软件断点包括用“中断”指令(例如x86上的int 3
)替换目标地址处的指令,然后等待CPU执行该指令。命中该指令后,CPU会引发异常并将控制权转移给调试器。好处是您可以定义任意数量的断点,但是缺点是这需要修改内存中的程序(对于只读内存中的程序可能是不可能的,否则可能导致程序的行为有所不同。读取自己的程序存储器)。
另一种是硬件断点,包括在CPU中设置一个特殊的调试寄存器,以使其在达到指定地址时中断。当程序计数器到达该地址时,CPU将自动引发异常。好处是不需要进行软件修改,但缺点是这依赖于有限的资源(调试寄存器),其中可能没有太多资源。例如,x86处理器通常只有4个调试地址寄存器,因此一次只能设置4个硬件断点。
调试器通常根据可用资源(例如前四个断点的硬件断点和此后的软件断点)选择策略,尽管也可以将许多配置为强制使用一种特定类型的断点。例如,流行的调试器GDB使用hbreak
命令来显式创建硬件断点。
关于c - 断点如何工作? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32482430/