c - 断点如何工作?

标签 c debugging

<分区>

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

谢谢!

最佳答案

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

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

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

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

关于c - 断点如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32482430/

相关文章:

C 编译器无法在 SUA/Interix 上创建可执行文件

C 函数调用 : Understanding the "implicit int" rule

C Web 浏览器下载文件

c - 指向函数的指针数组

python - Spyder和Python调试: can not set breakpoint

javascript - Chrome : Debug who changes document. 位置.hash

c - 循环在我的 C 代码中不起作用

c - 值(value)观是什么?

javascript - 无法在源映射文件中设置断点(使用 jquery 的示例)

R:运行 debugSource 时 fBody[[i]] 出错