gpt4 book ai didi

debugging - 调试器中的断点如何工作?

转载 作者:行者123 更新时间:2023-12-03 08:41:50 25 4
gpt4 key购买 nike

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

最佳答案

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

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

  • 其余的工作然后由调试器本身执行。
  • 软件断点不一定需要特殊的硬件功能。这里的调试器依赖于修改原始二进制文件(它是加载到内存的副本)。当您设置断点时,调试器会在断点位置放置特殊指令。这条特殊指令需要以某种方式让调试器检测到它(这条特殊指令)何时执行。这可以是一些导致某种中断/异常的指令,调试器可以 Hook ,或者一些处理调试单元控制的指令。如果它在某些操作系统下运行,则该操作系统需要支持修改正在运行的程序(例如 ptrace poke/peek)。 SW断点的缺点是调试器需要能够修改正在运行的程序,如果程序从某种只读存储器运行(在嵌入式世界中很常见),则这是不可能的。
  • 硬件断点(需要 CPU 支持)在不修改程序二进制文件的情况下实现类似的行为。这是特定于 CPU 的,但通常它允许您至少定义一个程序地址,在该地址处执行应该遇到断点。 CPU 不断地将当前 PC 与这些断点地址进行比较,一旦条件匹配,它就会中断执行。这些断点的数量总是有限的。
  • 关于debugging - 调试器中的断点如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14598524/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com