调试器中的断点如何工作? [英] How does a breakpoint in debugger work?

查看:65
本文介绍了调试器中的断点如何工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Breakpoints are one of the coolest feature supported by most popular Debuggers like GDB. But how a breakpoint works ? What code modifications does the compiler do to achieve the breakpoint? Are there any special hardware features used to support breakpoints?

推荐答案

编译器无需以任何方式修改二进制文件以支持断点。但是重要的是,

Compiler does not need to "modify" the binary in any way to support the breakpoints. However it is important, that:


  • 编译器在可执行文件中包含足够的信息(不是代码本身,而是相同部分的特殊部分)文件),以便调试器可以将用户要调试的源与机器代码相关联。调试器需要知道的一件事就是能够设置断点(除非直接指定地址),即程序功能和源代码行的起始位置(在哪个地址处)(在机器代码内)。

  • 代码没有通过编译器以任何方式进行优化,这使得无法关联源代码和机器代码。通常,您将需要未优化的调试代码或仅执行经过精心选择的优化的代码。

然后执行其余工作


  1. 软件断点不一定需要特殊的硬件功能。调试器在此依赖于修改原始二进制文件(将其副本加载到内存中)。设置断点时,调试器将在断点位置放置特殊指令。该特殊指令需要以某种方式让调试器检测其执行时间(该特殊指令)。这可能是导致调试器挂接到的某种中断/异常的某些指令,或者是处理调试单元控制的某些指令。如果此命令在某些操作系统上运行,则该操作系统需要支持修改正在运行的程序(例如ptrace poke / peek)。 SW断点的缺点是调试器需要能够修改正在运行的程序,如果程序是从某种只读内存(在嵌入式世界中很常见)运行的,则这是不可能的。

  2. 硬件断点(需要由CPU支持)实现了类似的行为,而无需修改程序二进制文件。这是特定于CPU的,但是通常它可以让您至少定义一个程序地址,在该地址执行应达到断点。 CPU不断将当前PC与这些断点地址进行比较,一旦条件匹配,它将中断执行。这些断点的数量总是有限的。

这篇关于调试器中的断点如何工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆