【问题标题】:How does a breakpoint in debugger work?调试器中的断点如何工作?
【发布时间】:2013-01-30 07:13:18
【问题描述】:

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

【问题讨论】:

标签: debugging compiler-construction gdb breakpoints


【解决方案1】:

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

  • 编译器在可执行文件中包含足够的信息(不在代码本身中,而是在同一文件的特殊部分中),以便调试器可以将用户想要调试的源代码与机器代码相关联。调试器需要知道一个典型的事情才能设置断点(除非您直接指定地址),即程序函数和源代码行的开始位置(在哪个地址)(在机器代码内)。
  • 编译器不会以任何方式优化代码,这使得无法关联源代码和机器代码。通常,您需要调试未优化的代码或仅执行精心挑选的优化的代码。

然后由调试器自己执行其余的工作。

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

【讨论】:

  • 那么第 2 点是为什么在调试时运行速度要慢得多?
  • 不,一般程序在调试时不应该运行得更慢。一些调试功能是一个例外,例如软件观察点,但设置断点不应减慢程序的速度。您所描述的可能是您在调试时不需要优化(或低优化)的副作用。
【解决方案2】:

首先要设置断点,我们必须在二进制文件中添加一些特殊信息。我们在编译 c 源文件时使用标志 -g 来包含此信息。软件调试器实际上使用此信息来放置断点。硬件断点支持的最佳示例是我所经历的 VxWorks。 基本上在断点处处理器停止。因此在内部,任何会给处理器带来异常的步骤都可以用来放置软件断点。而硬件断点通过匹配存储在硬件寄存器中的地址来工作,从而导致异常。所以硬件断点非常强大,但它严重依赖于架构。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-29
    • 2020-09-15
    • 2023-03-25
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 2010-09-18
    相关资源
    最近更新 更多