zoukankan      html  css  js  c++  java
  • 关于普通断点/内存断点/硬件断点

    断点都是通过触发程序异常,来达到使程序断下的目的

    1.普通断点:常规的有使用int 3,还有调试器平时的断点,这2种都为该类型断点,通过执行int 3达到触发异常,让程序断下的目的。但该断点修改了代码段,在反调试中容易被察觉。

    2.条件断点:在普通断点的基础上,增加限定条件。适用于某一下断处会被多地方调用,则加上限定条件(例:[esp-4]!=某一地址),以达到真正需要断下时触发。

    3.内存断点:通过修改内存的属性来达到触发异常。可设置触发条件为读、写、执行。但该断点会消耗较大资源,因为内存断点会将目标地址所在的一整个内存页中下断点,当同内存页非下断位置被读、写、访问也会触发,此时调试器会对比数据,看触发的断点位置是否为当初下断处。虽然内存断点的效率经常很不理想,但是因为仅仅是修改了一个内存属性,所以内存断点可以下数量非常多、单断点范围非常大。这是它的优势。

    4.硬件断点:硬件断点为CPU提供给我们的断点,由4个寄存器(DR0-DR3)存放断点地址,断点属性可设置为读、写、执行,由于寄存器数量有限,只能存在4个硬件断点,这4个断点是否执行由DR70246位决定,当置为1时,断点生效。

    读:当被下断位置执行读取操作后,在执行这个操作的位置断下。 例:a的地址为0x123;在123下读的断点后,0x456 if(a==1),则程序会在0x456处断下。

    写:当被下断位置执行写操作后,在执行这个操作的位置断下。例:a的地址为0x123;在123下写的断点后,0x456 a=1,则程序会在0x456处断下。

    执行:当运行到下断位置时,在该位置断下。 例:例如0x123456处的代码为c=a+b;在执行到这句时,会在0x123456处断下。

    以上断点的地址都在内存中,不能为寄存器。

  • 相关阅读:
    信号signal的监听与处理
    oracle 12cR1&12cR2核心高实用性新特性
    Tomcat 7服务器线程模型
    抓取awr、语句级awr、ashrpt
    从percona server 5.7换到mariadb 10.2
    关于typeid和typeof
    mysql查询INFORMATION_SCHEMA表很慢的性能优化
    使用ccache大幅度加速gcc编译速度至少1倍以上(不需要修改任何编译选项)
    c++ linux下输出中文
    visual studio 2015下使用gcc调试linux c++开发环境搭建完整详解
  • 原文地址:https://www.cnblogs.com/aaaguai/p/12769808.html
Copyright © 2011-2022 走看看