<分区>
一般来说,我知道断点的用法,但想知道它究竟是如何工作的?它如何中断正在执行的代码?它如何在可执行代码上提供用户界面(断点),以及为什么它通常只允许 6 个断点。
谢谢!
<分区>
一般来说,我知道断点的用法,但想知道它究竟是如何工作的?它如何中断正在执行的代码?它如何在可执行代码上提供用户界面(断点),以及为什么它通常只允许 6 个断点。
谢谢!
最佳答案
调试器通常可以设置两种不同的断点:软件断点和硬件断点。
软件断点包括用“中断”指令(例如 x86 上的 int 3
)替换目标地址处的指令并等待 CPU 执行它。当命中该指令时,CPU 会引发异常并将控制权转移给调试器。好处是你可以定义任意多的断点,但缺点是这需要修改内存中的程序(这对于只读内存中的程序可能是不可能的,或者如果它可能会导致程序表现不同读取自己的程序存储器)。
另一种是硬件断点,它包括在 CPU 中设置一个特殊的调试寄存器,要求它在遇到指定地址时中断。当程序计数器到达该地址时,CPU 将自动引发异常。好处是不需要修改软件,但缺点是这依赖于可能不多的有限资源(调试寄存器)。例如,x86 处理器通常只有 4 个调试地址寄存器,因此一次只能设置 4 个硬件断点。
调试器通常会根据可用资源选择一种策略(例如,前 4 个断点的硬件断点和之后的软件断点),尽管许多调试器也可以配置为强制使用一种特定类型的断点。例如,流行的调试器 GDB 具有显式创建硬件断点的 hbreak
命令。
关于c - 断点如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32482430/