如何 调用 系统 已注册的调试器 来调试 一个进程? 就像 任务管理器 中的调试一样 ??

解决方案 »

  1.   

    《Windows核心编程》第25章25.1 即时调试随时将调试程序连接到任何进程的能力称为即时调试( Just-in-time Debugging)。这里我们对它如何工作稍加说明:当程序员点击C a n c e l按钮,就是告诉U n h a n d l e d E x c e p t i o n F i l t e r函数对进程进行调试。在内部,U n h a n d l e d E x c e p t i o n F i l t e r调用调试程序,这需要查看下面的注册表子关键字:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
    在这个子关键字里, 有一个名为D e b u g g e r的数值,在安装Visual Studio时被设置成下面的值:"C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\msdev.exe"
       -p %ld -e %ld
    在Windows 98中,这些值不是存放在注册表中,而是存放在Wi n . i n i文件中。
    这一行代码是告诉系统要将哪一个程序(这里是M S D e v.  e x e )作为调试程序运行。当然也可以选择其他调试程序。U n h a n d l e d E x c e p t i o n F i l t e r还在这个命令行中向调试程序传递两个参数。第一个参数是被调试进程的I D。第二个参数规定一个可继承的手工复位事件,这个事件是由U n h a n d l e d E x c e p t i o n F i l t e r按无信号状态建立的。厂商必须实现他们的调试程序,这样才能认识指定进程I D和事件句柄的- p和- e选项。在进程I D和事件句柄都合并到这个串中之后, U n h a n d l e d E x c e p t i o n F i l t e r通过调用C r e a t e P r o c e s s来执行调试程序。 这时,调试程序进程开始运行并检查它的命令行参数。如果存在- p选项,调试程序取得进程I D,并通过调用D e b u g A c t i v e P r o c e s s将自身挂接在该进程上。
    BOOL DebugActiveProcess(DWORD dwProcessID);
    一旦调试程序完成自身的挂接,操作系统将被调试者( d e b u g g e e)的状态通报给调试程序。例如,系统将告诉调试程序,在被调试的进程中有多少线程?哪些D D L加载到被调试进程的地址空间中?调试程序需要花时间来积累这些数据,以准备调试进程。在这些准备工作进行的时候,U n h a n d l e d E x c e p t i o n F i l t e r中的线程必须等待。为此,这要调用Wa i t F o r S i n g l e O b j e c t函数并传递已经建立的手工复位事件的句柄作为参数。这个事件是按无信号状态建立起来的,所以被调试进程的线程要立即被挂起以等待事件。
    在调试程序完全初始化之后,它要再检查它的命令行,找- e选项。如果该选项存在,调试程序取得相应的事件句柄并调用S e t E v e n t。调试程序可以直接使用事件的句柄值,因为事件句柄具有创建的可继承性,并且被调试进程对U n h a n d l e d E x c e p t i o n F i l t e r函数的调用也使调试程序进程成为一个子进程。设定这个事件将唤醒被调试进程的线程。被唤醒的线程将有关未处理异常的信息传递给调试程序。调试程序接收这些通知并加载相应的源代码文件,再将自身放在引发异常的指令位置上。还有,不必在调试进程之前等待异常的出现。可以随时将一个调试程序连接在任何进程上,只需运行“MSDEV -p PID”,其中P I D是要调试的进程的I D。实际上,利用Windows 2000Task Manager,做这些事很容易。当观察P r o c e s s标记栏时,可以选择一个进程,点击鼠标右键,并选择D e b u g菜单选项。这将引起Task Manager去查看前面讨论过的注册表子关键字,调用C r e a t e P r o c e s s,并传递所选定的进程的I D作为参数。在这里, Task Manager为事件句柄传送0值。
      

  2.   

    这是 程序作为 Debugger 才用  BOOL DebugActiveProcess(DWORD dwProcessID);要得到 任务管理器 右键 一个进程 出现的菜单 中的 调试 功能,该怎么做呢?
      

  3.   

    那你没有仔细看完这段,里面不是说CreateProcess就行了吗?传一个进程句柄给调试程序就行了。
      

  4.   

    谢谢!!在下 没有 静下心来 拜读 Programming Applications for Microsoft Windows再次 sorry 和 感谢