比如其他一些调试器 可以暂停一个线程 单步执行一条指令 同时还可以查看cpu寄存器的情况
暂停线程和查看寄存器很容易实现 但是怎么控制线程单步呢?

解决方案 »

  1.   

    http://topic.csdn.net/t/20031104/14/2425870.html
    http://www.xfocus.net/articles/200412/765.html
    这2个说的比较详细了。
      

  2.   

    SuspendThread(hThread);
    执行1条指令(hThread); //这要怎么写
    ResumeThread(hThread);
      

  3.   

    windows用户模式下可以 int 3?
      

  4.   

    #include <iostream>int main(INT argc,char*argv[]){     _asm INT 3; //调用断点中断   cout << "Hello world!" << endl;}自己试试吧
      

  5.   

    上面的程序crash了
      Exception Code: 80000003
      Exception Offset: 00001003
      

  6.   

    这个我真不知道怎么回事了,OD断点就是用的int3,但OD并不是内核态调试器,也许你应该VirtualProtectEx设置一下
       //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;
    }
      

  7.   

    你是使用vc吗?在你要设置断点的代码语句前F9
      

  8.   

    调试器在对被调试的进程进行控制。调试器创建进程后,如果没断点则直接运行。如果用户在某一行设置断点(如vc6里面的F9),那么调试器将该行对应的指令的第一个字节改为__asm int 3; 当运行到该__asm int 3的位置时,会有异常产生。此时调试器接收到该异常,于是挂起所有线程,然后恢复修改为__asm int 3之前的代码。这时候程序员就可以查看一些相关的状态信息,如变量,内存之类的。最后程序员选择继续运行。每个断点都是重复该过程。参与的角色有3个:程序员,调试器,被调试进程(也就是程序员开发的程序)详细的过程可以看看John Robbins的书<Debugging Windows>