调试器在对被调试的进程进行控制。调试器创建进程后,如果没断点则直接运行。如果用户在某一行设置断点(如vc6里面的F9),那么调试器将该行对应的指令的第一个字节改为__asm int 3; 当运行到该__asm int 3的位置时,会有异常产生。此时调试器接收到该异常,于是挂起所有线程,然后恢复修改为__asm int 3之前的代码。这时候程序员就可以查看一些相关的状态信息,如变量,内存之类的。最后程序员选择继续运行。每个断点都是重复该过程。参与的角色有3个:程序员,调试器,被调试进程(也就是程序员开发的程序)详细的过程可以看看John Robbins的书<Debugging Windows>
http://www.xfocus.net/articles/200412/765.html
这2个说的比较详细了。
执行1条指令(hThread); //这要怎么写
ResumeThread(hThread);
Exception Code: 80000003
Exception Offset: 00001003
//VirtualAllocEx(pi.hProcess,(LPVOID)0x0101259b,sizeof(INT3), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
SuspendThread(pi.hThread);
VirtualProtectEx(pi.hProcess,(LPVOID)BreakPoint,1,PAGE_READWRITE, &OldProtect);
bool ret = WriteProcessMemory(pi.hProcess,(LPVOID)BreakPoint,&INT3,sizeof(INT3),NULL);
VirtualProtectEx(pi.hProcess,(LPVOID)BreakPoint,1,OldProtect,&OldProtect);
HasINT3 = ret;
ResumeThread(pi.hThread);
return ret;
}