[讨论]DR6 寄存器有违常理

小希希 2018-5-14 22:16 327
照抄软件调试 88页 对于dr6寄存器的说明
调试寄存器(DR6)的作用是当CPU检测到匹配断点条件的断点或有其他调试事件发生时,用来向调试器的断点异常处理程序传递断点异常的详细信息。

上个结构体
typedef struct _DEBUG_DR6_
{
  union{
    ULONG32 _DR6;
    struct {
      unsigned B0 : 1;
      unsigned B1 : 1;
      unsigned B2 : 1;
      unsigned B3 : 1;
      unsigned Reverted : 9;
      unsigned BD : 1;
      unsigned BS : 1;
      unsigned Reverted2 : 17;
    }st;
  }u;
}DEBUG_DR6, *PDEBUG_DR6;

当调试事件发生时,b0 - b3 位处理器会在调用异常处理程序前就置1,具体置什么看具体断点情况.
如果是单步异常 BS位会被置1
------------------------------------------------------------
我遇到的问题是,设置了内存读写硬件断点,当收到 DbgSingleStepStateChange 状态时用GetThreadContext 获取到的DR6寄存器是0
我看了 titanengine 源代码 TitanEngine.Debugger.DebugLoop.cpp DebugLoop()函数也是同样获取Context 判断当前硬件断点信息



问题就在这里, DbgSingleStepStateChange  异常到来时 为什么DR6是0,谁吧这里清0了,或者说什么情况下CPU不设置DR6寄存器?





最后于 2018-5-14 22:18 被小希希编辑 ,原因:
最新回复 (1)
小希希 5天前
2
大概情况是这样的

黑粗体是我的说明,非粗体是od日志打印

OD设置硬件断点  

           ----------------------------------PID[2621016 ,0027fe58]SetThreadContext START-----------------------------------------
           OD设置:                       00010010
           EIP:                          05b91b38
           单步异常                      false
           硬件断点信息:
           DR0   地址:004a8480 类型:硬件执行,长度: 1
           OD设置CONTEXT成功
           ----------------------------------SetThreadContext END-----------------------------------------
           #####################收到异常#######################
           线程ID:0027fe58,状态:DbgSingleStepStateChange,地址:004a8480
           硬断信息[004A8480] [dr0|硬件执行|1],是OD设置(单步:false,硬断:true)

004A8480   硬件断点 1 位于 脚本编辑.004A8480                      
                    断到了这里后取消硬件断点f9运行,看下面OD设置先取消硬件断点,然后又设置了一个单步断点


           ----------------------------------PID[2621016 ,0027fe58]SetThreadContext START-----------------------------------------
           OD设置:                       00010010
           EIP:                          002507d0
           单步异常                      false
           硬件断点信息:
           OD设置CONTEXT成功
           ----------------------------------SetThreadContext END-----------------------------------------
           ----------------------------------PID[2621016 ,0027fe58]SetThreadContext START----------------------------------------- 
           OD设置:                       0001001f
           EIP:                          004a8480
           单步异常                      true
           预测EIP[1]:004a8481
           硬件断点信息:
           OD设置CONTEXT成功
           ----------------------------------SetThreadContext END-----------------------------------------
           #####################收到异常#######################
           到这里,dr6 dr7 都是0

           线程ID:0027fe58,状态:DbgSingleStepStateChange,地址:004a8481
           DR6                           00000000
           DR7                           00000000
           OD自己设置的单步断点让他自己处理去!!!

           到这里,OD取消上一次设置的单步断点
           ----------------------------------PID[2621016 ,0027fe58]SetThreadContext START-----------------------------------------   
           OD设置:                       0001001f
           EIP:                          004a8481
           单步异常                      false
           硬件断点信息:
           OD设置CONTEXT成功
           ----------------------------------SetThreadContext END-----------------------------------------


总结下就是设置硬件断点断下后,取消硬件断点 f9 运行就会造成  dr6寄存器出现0的奇葩问题



返回