!process 命令详解
相比切换进程上下文的元命令 .process
,扩展命令 !process
的语法稍显复杂。
通过 .hh !process
命令查找 WinDbg 的内置帮助文档可得知语法格式如下:
!process [/s Session] [/m Module] [Process [Flags]]
!process [/s Session] [/m Module] 0 Flags ImageName
/s Session
:指定该进程所属的会话。/m Module
:指定拥有该进程的模块(即进程加载的 DLL/SYS 等 Windows PE模块文件),该参数对 API 集 DLL(api-ms-win-*.dll)无效(API 集可能被合并或优化处理),使用 API 集 DLL 名称作为该参数将不会得到有效输出。Flags
:标志位,指定要显示的详细级别。标志可以是以下位的任意组合。如果标志为 0,则只显示最少量的信息。默认值根据 Windows 版本和 Process 的值而有所不同。如果省略 Process 或 Process 的值为 0 或 -1,则默认值为 0x3;否则,默认值为 0xF,下文详细介绍了该参数各个位的含义。
下面给出一些示例,帮助大家理解 !process 的用法。
!process /m kernel32.dll 0 0 // 显示所有加载 kernel32.dll 的进程基本信息// 此处必须加 DLL 扩展名,SYS 等其他 PE 模块文件也一样,否则无任何有效输出
!process /s 0 0 0 // 显示会话 0(系统会话)中所有进程的基本信息
!process ffff8983045bb080 1f // 显示 EPROCESS 地址为 ffff8983045bb080 的进程(及其线程和线程的调用栈)的最详细信息
!process /s 1 0 1f explorer.exe // 显示会话 1 中运行的映像名为 explorer.exe 的所有进程的最详细信息
Flags 参数
以下参数位是可以自由组合的,比如 !process 0 1f explorer.exe 命令显示了映像名为 explorer.exe 的所有进程的 WinDbg 全部可以显示的信息(0x1f=0x1+0x2+0x4+0x8+0x10)。
- 位 0 为 1(0x1)表示:显示时间和优先级统计信息。
- 位 1 为 1(0x2)表示:显示与该进程相关的线程和事件列表,以及它们的等待状态。
- 位 2 为 1(0x4)表示:显示与该进程关联的线程列表。如果包含此选项但未包含位 1 (0x2),每个线程将显示在单独的一行上。如果与位 1 一起包含,每个线程将显示堆栈跟踪。
- 位 3 为 1(0x8)表示:(仅适用于 Windows XP 及更高版本)显示每个函数的返回地址、堆栈指针,以及(在基于 Itanium 的系统上)bsp 寄存器的值。函数参数的显示被抑制。
- 位 4 为 1(0x10)表示:(仅适用于 Windows XP 及更高版本)在此命令期间,将进程上下文设置为指定的进程。这会导致线程堆栈的显示更为准确。因为此标志相当于对指定进程使用 .process /p /r,所以任何现有的用户模式模块列表将被丢弃。如果 Process 为零,调试器将显示所有进程,并且进程上下文将为每个进程进行更改。如果您仅显示单个进程且其用户模式状态已经刷新(例如,使用 .process /p /r),则无需使用此标志。此标志仅在与位 0 (0x1) 一起使用时有效。