!bpid
!bpid 扩展要求目标机上的某个进程中断到调试器中,或者要求用户模式调试器附加到目标机上的某个进程上。
语法
!bpid [Options] PID
参数
- Option
- 控制该命令的其他行为。
Option 的合法值有下面这些。
| -a |
将一个新的用户模式调试器附加到PID指定的进程上。该用户模式调试器在目标机上运行。 |
| -s |
在WinLogon进程中添加一个在PID指定的用户模式进程中断前立即触发的断点。这使得在尝试操作之前有一次机会来验证该请求。 |
| -w |
将请求保存在目标机的内存中。之后目标系统可以重复该请求,但是一般不需要这样。 |
- PID
- 指定目标机上的进程ID。如果使用该命令来控制目标机上的用户模式调试器,则PID应该是目标进程的ID,而不是用户模式调试器的ID。(由于进程ID一般以10进制列出来,所以可能需要在前面加上0n前缀或者转换成16进制格式。)
DLL
| Windows 2000 |
不可用 |
| Windows XP和之后 |
Kdexts.dll |
该扩展命令仅在x86、x64和Itanium目标机上支持。
注释
该命令在将用户模式调试器的输入输出重定向到内核调试器时特别有用。它使得用户模式目标程序中断到用户模式调试器中,并且从内核调试器请求输入。查看从内核调试器控制用户模式调试器获得详细信息。
如果在其他情况下使用该命令,用户模式进程会调用DbgBreakPoint。这一般会直接中断到内核调试器中。
-s 选项使得指定进程的断点触发之前先在WinLogon中触发一个断点。如果想在WinLogon的进程上下文中进行一些调试操作时有用。g (Go)命令可以转移到第二个断点。
有些情况该扩展会失败:
- 缺乏资源。!bpid 扩展会在目标进程中注入一个线程,所以系统必须有足够资源来创建它。使用-a
选项需要更多的系统资源,因为!bpid -a 必须在目标机上运行一个完整的调试器实例。
- 加载器锁(loader lock)已经被持有了。!bpid和!bpid -a都需要在目标进程运行一个线程才能让它中断到调试器中。如果另一个线程已经持有了加载器锁,!bpid线程就不能运行,并且不会造成中断到调试器中。因此,如果!bpid在目标进程拥有足够的用户模式内存时失败,则可能是加载器锁已经被持有了。
- 缺少权限。!bpid 扩展命令的操作需要有足够的权限使得WinLogon创建远线程,以及附加一个调试器到指定进程上。
- 访问不到ntsd.exe。如果在一般的已知路径中未找到ntsd.exe,!bpid不能成功的设置适当的PID。注意在Windows
Vista中默认不包含ntsd.exe。
Build machine: CAPEBUILD