我想知道gdb如何在内部工作.例如,我知道它使用ptrace()系统调用来监视跟踪程序.但我想知道它如何处理信号,如何插入新代码,以及它做的其他如此神话般的事情.
取自gdbint.pdf:
它可以作为硬件断点或作为软件断点来完成:
- 某些芯片有时会提供硬件断点作为内置调试功能。通常,这些操作是通过使用专用寄存器来实现的,其中可以存储断点地址。如果PC(程序计数器的简写)曾经与断点寄存器中的值匹配,则CPU会引发异常并将其报告给GDB。
- 另一种可能是使用仿真器时。许多仿真器都包含监视来自处理器的地址线的电路,如果该地址与断点的地址匹配,则强制其停止。
- 第三种可能性是目标已经能够以某种方式进行断点操作。例如,ROM监视器可以执行自己的软件断点。因此,尽管这些并不是字面上的硬件断点,但从GDB的角度来看,它们的作用相同。
- 软件断点要求GDB做更多的工作。基本理论是GDB将用陷阱,非法除法或其他引起异常的指令替换程序指令,然后在遇到该指令时,GDB将采用异常并停止程序。当用户说要继续时,GDB将还原原始指令,单步执行,重新插入陷阱,然后继续。