关于c ++:GDB如何知道它必须在指定的断点处中断?

how GDB knows it has to break at specified break point?

一个基本问题&我对C / C ++和GDB还是很陌生。

我们使用GDB调试过程。 我们将GDB附加到进程,然后指定filename.c以及行号以放置断点。

我的问题是"在将GDB连接到正在运行的进程之后,GDB或OS或其他任何东西怎么可能知道必须在指定的行号(在filename.c中)中断?"

可以想象到的是,当前进程在调试模式下运行并且应用了一个断点,并且该进程的执行必须在该点中断(等待用户输入)?


如果您的程序在某个特定点停止或崩溃,则调试器可以告诉您该点在程序中的位置。

为了使这两种方法都起作用,程序二进制文件必须包含其他调试信息,这些信息将程序映像中的地址与源代码中的位置(源文件和行号)相关联。

要在特定行添加断点,调试器会找到最接近该行的程序地址,修改内存中可执行文件的副本,以在该位置插入特殊的" break"指令,这将导致程序的执行被中断,然后"跟踪"程序的执行,并等待其到达断点并停止。

有关更多详细信息,请参见http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1/和http://www.howzatt.demon.co.uk/articles/SimplePTrace.html


我不能评论最新版本的gdb-但是许多调试器实际上将汇编指令与中断指令交换到所需的断点位置(在内存中)。这将"唤醒"调试器,该调试器将在此时进行控制。

使用替换的中断指令意味着CPU可以全速执行程序,并在所需的位置"跳闸"。

但是,现代处理器非常复杂,并且可能具有出色的调试功能。


GDB知道您的代码:它了解所有代码。当您在一行上设置断点时,GDB将获得等效的机器指令地址:您的所有代码(作为机器指令)都已加载到内存中,因此您的代码指令中都有一个地址。

因此,现在GDB知道您要中断的指令的地址了。当您运行程序时,GDB将使用ptrace,这使GDB可以在执行每个指令之前"查看"它们。然后,GDB只需查看当前指令(将要执行)是否与您的指令(要中断的指令)相同。


如果在gcc / g ++中使用了-g选项,则每个源文件的行号将附加到结果对象文件中的指令中。