断点是 GDB 等最流行的调试器支持的最酷的功能之一。但是断点是如何工作的呢?编译器做了哪些代码修改来实现断点?是否有任何特殊的硬件功能用于支持断点?
编译器不需要以任何方式“修改”二进制文件来支持断点。但重要的是:
其余工作由调试器本身执行。
要首先放置断点,我们必须在二进制文件中添加一些特殊信息。我们在编译 c 源文件时使用标志 -g 来包含此信息。软件调试器实际上使用此信息来放置断点。最好正如我所经历的,硬件断点支持的例子是在 VxWorks 中。 基本上在断点处处理器会停止。因此,在内部任何会给处理器带来异常的步骤都可以用来放置软件断点。而硬件断点的工作原理是匹配硬件寄存器中存储的地址以引发异常。所以硬件断点非常强大,但它严重依赖于架构。
这里有一个很好的解释 硬件断点和软件断点有什么区别? 这里给出了处理器相关信息的良好介绍 http://processors.wiki.ti.com/index.php/How_Do_Breakpoints_Work