断点分类

    xiaoxiao2022-07-07  202

    int3 软件断点

    临时在代码插入CC命令

    引发EXCEPTION_BREAKPOINT 0x80000003异常

    内存断点 

    将想下断地址所在内存页增加一个名为PAGE_NOACCESS(写入时设为PAGE_EXECUTE_READ)的属性,引发异常再判断地址是否为断点位置,以页为单位,慢但是可以多个。

    引发STATUS_GUARD_PAGE_VIOLATION(0x80000001)异常。

    硬件断点 DR0~DR7

    DR0到DR3调试地址寄存器,用来保存断点地址,

    DR4到DR5保留,当调试扩展功能被启用(CR4的寄存器DE位设置为1),任何对DR4和DR5的引用都会导致一个非法指令异常(#UD),当此功能被禁止时,DR4和DR5分别是DR6和DR7的别名寄存器,等价于后者。

    DR6到DR7用来控制断点大小和出发时机。触发造成STATUS_SINGLE_STEP单步异常0x80000004断点。DR6的作用是当调试事件发生时,向调试器报告事件详细信息,以供调试器判断是何种事件。

    Dr7,有24位被划分位4组对应4个调试地址寄存器,比如L0,G0,R/W0,LEN0这6为与DR0对应,

    比如R/W0-3是00时执行此地址中断,01是写入中断,10是通过把CR4寄存器DE(调试拓展)位设为1启用该组合,即当向相应地址进行I/O读写时中断,11是读写数据都中断,但是从该地址读取指令除外。

    LEN0-3是两位,00是1字节,01是2字节,10是8字节。11是4字节

    L0-3是局部断点启用。1是启用,0是静止。

    G0-3是全部断点启用,与L0不同的是,断点条件发生,CPU不会清除此断点。

    LE和GE 启用局部或者全局精准断点,486之后都忽略的。

    GD 启用访问检测,启用或禁止对调试寄存器的保护,为1是,cpu检测到将修改DR0到7的指令,cpu会在执行前产生一个调试异常

    参考资料

    《软件调试》张银奎

    最新回复(0)