首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调试器中的断点是如何工作的?

调试器中的断点是如何工作的?
EN

Stack Overflow用户
提问于 2013-01-30 15:13:18
回答 2查看 20.4K关注 0票数 37

断点是GDB等最流行的调试器支持的最酷的特性之一。但是断点是如何工作的呢?编译器做了哪些代码修改来实现断点?是否有用于支持断点的特殊硬件功能?

EN

回答 2

Stack Overflow用户

发布于 2013-01-30 16:43:16

编译器不需要以任何方式“修改”二进制文件来支持断点。然而,重要的是:

  • 编译器在可执行文件中包含了足够的信息(即不在代码本身中,而是在同一文件的特殊部分中),以便调试器可以将用户想要调试的源代码与机器代码关联起来。调试器要能够设置断点(除非您直接指定地址),需要知道程序函数和源代码行(在机器代码中)的起始位置(在哪个地址)。
  • 代码没有以任何方式由编译器优化,这使得不可能将源代码和机器代码关联起来。通常,您需要调试未优化的代码或仅执行仔细选择的优化的代码。

然后,其余的工作由调试器本身执行。

  1. 软件断点不一定需要特殊的硬件功能。这里的调试器依赖于修改原始二进制文件(加载到内存中的副本)。当您设置断点时,调试器将在断点位置放置特殊指令。这条特殊指令需要以某种方式让调试器检测到它(这条特殊指令)正在执行。这可以是引起某种类型的中断/异常的某种指令,调试器可以挂接到其上,或者是处理对调试单元的控制的某种指令。如果这在某些操作系统下运行,则该操作系统需要支持修改正在运行程序(使用类似ptrace poke/peek的内容)。SW断点的缺点是调试器需要能够修改正在运行的程序,如果程序是从某种只读存储器运行的(在嵌入式world).
  2. Hardware断点(需要由CPU支持)中非常常见),则不可能在不修改程序二进制文件的情况下实现类似的行为。这是特定于CPU的,但通常它至少允许您定义执行应该命中断点的程序地址。CPU不断地将当前PC与这些断点地址进行比较,一旦条件匹配,它就会中断执行。这些断点的数量始终是有限的。
票数 26
EN

Stack Overflow用户

发布于 2015-09-08 15:15:24

要设置断点,首先我们必须在二进制文件中添加一些特殊信息,使用标志-g,同时编译c源文件以包含此info.The软件调试器实际上使用此信息来设置break points.The硬件断点支持的最佳示例是VxWorks,据我所知。基本上,在断点处,处理器内部的halts.So任何会给处理器一个异常的步骤都可以用来放置一个软件断点point.While硬件断点通过匹配存储在硬件寄存器中的地址来产生exception.So硬件断点是非常强大的,但它严重依赖于体系结构。

这里有一个很好的解释:What is the difference between hardware and software breakpoints?这里给出了一个很好的介绍,介绍了处理器相关的信息。http://processors.wiki.ti.com/index.php/How_Do_Breakpoints_Work

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14598524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档