现在的位置: 首页 > 综合 > 正文

[C++] 关于gdb断点的真相

2013年09月13日 ⁄ 综合 ⁄ 共 497字 ⁄ 字号 评论关闭

gdb的断点是基于信号(signal)实现的

在某个地址增加一个断点,实际上就是修改那个地址的代码,把原来的代码替换成INT 3指令,同时让gdb捕获这个signal并做相应的处理:包括执行被替换掉的指令,并跳转回来。

因此,只要断点不被走到,那么断点就不会影响程序的运行效率;因为程序的其他地方都没改变,该怎么运行还是怎么运行。

gdb在遇到断点之后可以做很多事情

包括:

停下来等用户处理

自动继续

自动执行一些gdb指令(用commands命令可以配置断点的自动执行)

判断条件是否要停下来(这就是大名鼎鼎的条件断点)

在走到断点之后,不管是路过还是停下来,都会影响性能

因为通常到了断点就会通过INT3停下来。

只是条件断点有点特别,它分为软件和硬件两种。这是因为条件断点这个需求太普遍了,因此有人就想了一个办法从硬件支持一部分:在x86平台,某些条件断点可以不插入INT 3,而是插入一个其他指令,当程序走到这个地址的时候,并不是直接发出INT 3信号,而是先去比较一下特定寄存器和某个地址的内容,再决定要不要INT 3。

如果能采用硬件条件断点,会比软件条件断点的性能好很多。搜索‘硬件断点寄 存器’会找到更多信息。

抱歉!评论已关闭.