c++ - 硬件断点 EXCEPTION_SINGLE_STEP 始终

标签 c++ c debugging hardware breakpoints

我有一个充当调试器的程序。我为线程设置了一个 hw bp,将 dr0 设置为我希望 bp 所在的地址,将 dr7 设置为 1,因为我希望 bp 在每次执行该地址时生成一个事件。

它有效,但现在的问题是我一直没有停止接收 EXCEPTION_SINGLE_STEP。我像往常一样使用 WaitForDebugEvent 创建了一个循环:

DebugActiveProcess(pid);
while (flag == 0)
    {
        WaitForDebugEvent(&DBEvent, INFINITE);
        if (first_time){
            setHWBPInCurrentThreads(pid, breakpoint_address);
            first_time = 0;
        }
        switch (DBEvent.dwDebugEventCode)
        {
            // Here we check if a new thread is created and we set a BP for all of them
            case CREATE_THREAD_DEBUG_EVENT: 
            {
                HANDLE thread_handle = DBEvent.u.CreateProcessInfo.hProcess;
                HANDLE hX3 = SetHardwareBreakpoint(thread_handle, HWBRK_TYPE_CODE, HWBRK_SIZE_1, breakpoint_address);

            }break;

            case EXCEPTION_DEBUG_EVENT:
            {
                switch (DBEvent.u.Exception.ExceptionRecord.ExceptionCode)
                {
                case EXCEPTION_SINGLE_STEP:
                {       
                    printf("%d\n", DBEvent.dwThreadId);
                    ///MessageBoxA(0, "yesssssssss", "", 0);
                }break;

                case EXCEPTION_BREAKPOINT:
                {
                    //MessageBoxA(0, "Found break point", "", 0);

                }break;
                }
            }break;

        }

        ContinueDebugEvent(DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE);
                }

这里有什么问题?我应该怎么做才能让异常消失,只在下次执行该地址时才获得控制权?

最佳答案

即使在命中断点后,您的实现也只是继续调试事件,这将在无限循环中再次触发断点。

正确的实现需要根据您使用的环境进行不同的处理。如果您在比 Windows XP 更新的环境中进行调试,则处理断点的方式将是:

  1. 设置恢复标志 (EFLAG)。
  2. 继续调试事件 (ContinueDebugEvent)。

如果您确实在 Windows XP 环境中工作,则您的实现需要更改为:

  1. 禁用断点 (Dr7)。
  2. 设置陷阱标志 (EFLAG)。
  3. 继续调试事件 (ContinueDebugEvent)。
  4. 等待由陷阱标志引起的 EXCEPTION_SINGLE_STEP(您现在处于下一条指令)。
  5. 启用断点 (Dr7)。
  6. 继续调试事件 (ContinueDebugEvent)。

很抱歉打扰这个旧线程,但是,这些是正确的实现。

关于c++ - 硬件断点 EXCEPTION_SINGLE_STEP 始终,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29287507/

相关文章:

c++ - 只写指针类型

c - 根据条件匹配数组元素

C编程: Read from file and print on screen

c - GDB 是否可以逐行转储它执行的代码?

c++ - 打印给定编号的所有分区

c++ - 如何根据输入中定义的 "external"int 在结构中定义数组大小

c++ - Windows 中的 QSharedMemory 不一致行为

c - libpcap - 数据包 ip header 长度为零字节,带有环回 tcp 请求

android - 谷歌日历事件链接未打开谷歌日历应用事件创建详细信息

c++ - 如何在 gdb 中打印长字符串的完整值?