最近一直在实现一个有OD所有功能的调试器,下面给出对于实现部分的方法和遇到的问题,希望对也在实现调试器的朋友有所帮助。
设置内存断点和对输入表函数里面的函数等等,如果大家觉得需要,我在发帖写出来。
下面是硬件断点的设置问题。
主要实现代码是:
CONTEXT cx;
cx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
if(FALSE==GetThreadContext(pi->hThread, &cx))
{
err=GetLastError();
}
cx.Dr0 = dwBreakPointAddress;//硬件断点地址
cx.Dr7 |= 0x401;
if(FALSE==SetThreadContext(pi->hThread, &cx))
{
err=GetLastError();
};
代码虽然很短,但是有很多需要注意的地方,比如,pi的权限,获取线程信息的时间。
我就只挑我出现问题的地方做出解释:
cx.ContextFlags = CONTEXT_DEBUG_REGISTERS;这句不能用CONTEXT_CONTROL。
看定义
#define CONTEXT_CONTROL (CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP
知道为什么了吧。
这句
cx.Dr7 |= 0x401;
设置dr7不是很复杂的问题,大家看看intel的手册就明白了 ,如果只想用dr0设置一个断点,那么这里用0x1或者0x101都可以。如果要有其他复杂的控制,就仔细看看Intel 的手册吧。
下硬件断点的时间需要重点注意下:
在进入调试循环后,第一次EXCEPT_BREAKPOINT就设置硬件断点,肯定不会行的(我在网上查资料的时候,看见很多人犯了这个错误),因为他不是main真正的现场CONTEXT(It's because at the time of the DEBUG_BREAK hasn't the main thread it's real context. NT sets the real context later via the NtContinue API. So a possible method to set a BPM directly at the EntryPoint...)。所以需要在入口地址后下断点 ,然后设置硬件断点。
其他问题和一些异常处理太多我就没有给出代码和分析了。
- 标 题:调试器设计_硬件断点
- 作 者:Tweek
- 时 间:2009-09-09 18:50
- 链 接:http://bbs.pediy.com/showthread.php?t=97496