一个基本问题,我是C/C++和GDB的新手.
我们使用GDB来调试进程.我们将GDB附加到进程,然后指定filename.c以及行号以放置断点.
我的问题是"在我们将GDB连接到正在运行的进程之后,GDB或操作系统或其他任何可能知道它必须在指定的行号(在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可以全速执行程序并在所需位置"跳闸".
然而,现代处理器非常复杂,并且可能具有更好的调试功能.