gdb的断点是基于信号(signal)实现的
在某个地址增加一个断点,实际上就是修改那个地址的代码,把原来的代码替换成INT 3指令,同时让gdb捕获这个signal并做相应的处理:包括执行被替换掉的指令,并跳转回来。
因此,只要断点不被走到,那么断点就不会影响程序的运行效率;因为程序的其他地方都没改变,该怎么运行还是怎么运行。
gdb在遇到断点之后可以做很多事情
包括:
停下来等用户处理
自动继续
自动执行一些gdb指令(用commands命令可以配置断点的自动执行)
判断条件是否要停下来(这就是大名鼎鼎的条件断点)
在走到断点之后,不管是路过还是停下来,都会影响性能
因为通常到了断点就会通过INT3停下来。
只是条件断点有点特别,它分为软件和硬件两种。这是因为条件断点这个需求太普遍了,因此有人就想了一个办法从硬件支持一部分:在x86平台,某些条件断点可以不插入INT 3,而是插入一个其他指令,当程序走到这个地址的时候,并不是直接发出INT 3信号,而是先去比较一下特定寄存器和某个地址的内容,再决定要不要INT 3。
如果能采用硬件条件断点,会比软件条件断点的性能好很多。搜索‘硬件断点寄 存器’会找到更多信息。