我想知道gdb如何在内部工作。 例如我知道一个简单的想法,它利用ptrace()系统调用来监视跟踪程序。 但我想知道它如何处理信号,如何插入新代码,以及其他如此神奇的事情。
答案 0 :(得分:16)
查看GDB Internals Manual,其中包含一些重要方面。此文档中还有较早的PDF version。
从手册:
本文档记录了GNU调试器gdb的内部结构。它包括gdb的关键算法和操作的描述,以及使gdb适应特定主机和目标的机制。
答案 1 :(得分:6)
你要发现的唯一方法是研究source。
您也可以构建它并自行调试它。逐步完成代码,您将完全了解 它是如何做到的。
阅读GDB源代码并不适合胆小的人 - 它充满了宏,而且大量使用libbfd
,这本身很难理解。
必须这样做,因为它是可移植的(特别是在没有ptrace()
的平台上构建和工作)。
答案 2 :(得分:4)
取自gdbint.pdf:
它可以作为硬件断点或软件来完成 断点:
- 硬件断点有时可用作内置调试功能和一些芯片。通常这些工作都是专门的 寄存器可以存储断点地址。如果是PC (程序计数器的简写)与断点中的值匹配 寄存器,CPU引发异常并将其报告给GDB。
- 另一种可能性是使用仿真器时;许多仿真器都包含监视从地址线出来的地址线的电路 处理器,并在地址与断点匹配时强制停止 地址。
- 第三种可能性是目标已经具备以某种方式做断点的能力;例如,ROM监视器可以自己做 软件断点。所以尽管这些并不是硬件 断点,从GDB的角度来看,他们的工作方式相同;
- 软件断点要求GDB做更多的工作。基本理论是GDB将用陷阱替换程序指令, 非法划分,或其他一些会导致 异常,然后遇到它时,GDB会接受异常 并停止该程序。当用户说继续时,GDB将恢复 原始指令,单步,重新插入陷阱,和 继续。