作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个充当调试器的程序。我为线程设置了一个 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 更新的环境中进行调试,则处理断点的方式将是:
如果您确实在 Windows XP 环境中工作,则您的实现需要更改为:
很抱歉打扰这个旧线程,但是,这些是正确的实现。
关于c++ - 硬件断点 EXCEPTION_SINGLE_STEP 始终,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29287507/
我有一个充当调试器的程序。我为线程设置了一个 hw bp,将 dr0 设置为我希望 bp 所在的地址,将 dr7 设置为 1,因为我希望 bp 在每次执行该地址时生成一个事件。 它有效,但现在的问题是
我是一名优秀的程序员,十分优秀!