zoukankan      html  css  js  c++  java
  • [C++] 关于gdb断点的真相


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

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

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


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

    包括:

    停下来等用户处理

    自动继续

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

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


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

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

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

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


  • 相关阅读:
    黑客术语1
    leetcode笔记--3 Niim game
    台湾ML笔记--1.2 formalize the learning probelm
    台湾ML笔记--1.1什么时候适合使用ML
    leetcode笔记--2 reverse string
    leetcode笔记--1 two-sum
    数据挖掘导论笔记1
    python基础----ipython快捷键
    记录新的开始
    编译器错误消息: CS1617: 选项“6”对 /langversion 无效
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330398.html
Copyright © 2011-2022 走看看