C++ GDB如何知道它必须在指定的断点处中断?

C++ GDB如何知道它必须在指定的断点处中断?,c++,c,gdb,C++,C,Gdb,一个基本问题&我对C/C++和GDB非常陌生 我们使用GDB调试一个进程。我们将GDB附加到进程,然后指定filename.c和行号以放置断点 我的问题是“在我们将GDB连接到正在运行的进程之后,GDB、OS或其他任何东西如何知道它必须在指定的行号(在filename.c中)处中断?” 比如说,当前进程在调试模式下运行,并应用断点,进程执行必须在该点中断(等待用户输入)?如果使用gcc/g++中的-g选项,则每个源文件的行号都会附加到生成的目标文件中的指令中 同样,如果程序在某个特定点停止或崩溃

一个基本问题&我对C/C++和GDB非常陌生

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

我的问题是“在我们将GDB连接到正在运行的进程之后,GDB、OS或其他任何东西如何知道它必须在指定的行号(在filename.c中)处中断?”


比如说,当前进程在调试模式下运行,并应用断点,进程执行必须在该点中断(等待用户输入)?

如果使用gcc/g++中的-g选项,则每个源文件的行号都会附加到生成的目标文件中的指令中

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

为了使这两种方法都有效,程序二进制文件必须包含额外的调试信息,将程序映像中的地址与源代码中的位置(源文件和行号)关联起来

若要在特定行添加断点,调试器将查找最靠近该行的程序地址,修改内存中可执行文件的副本,在该位置插入一条特殊的“break”指令,这将导致程序执行中断,然后“traces”程序的执行,并等待它到达断点并停止


有关更多详细信息,请参阅,GDB知道您的代码:它知道所有关于它的信息。当您在一行设置断点时,GDB将获得等效的机器指令地址:所有代码(作为机器指令)都加载到内存中,因此代码的指令都有一个地址


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

我无法评论最新版本的GDB-但许多调试器实际上会在所需断点位置(内存中)用中断指令交换汇编指令。这将“唤醒”调试器,调试器将在此时进行控制

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


然而,现代处理器非常复杂,可能具有非常出色的调试功能。

看看@Noney:这将是一个很好的答案。在许多体系结构(例如x86)上,调试寄存器允许设置(几个)断点而不修改程序文本。您描述的方法是可能的,但速度太慢(1000倍或更多)在实践中是不可用的。这不是可用调试器的实际工作方式。我同意…它太慢了