Debugging Tools for Windows |
.context 命令用于指定用户模式地址上下文使用哪个进程的页目录,或者显示当前的用户模式地址上下文。
模式 | 仅内核模式 |
目标 | 活动目标、崩溃转储 |
平台 | 所有 |
一般来说,进行内核调试时,能看到的唯一的用户模式地址空间是关联到当前进程的那个。
.context命令让内核调试器将指定的页目录作为用户模式地址上下文。该命令执行后,调试器就可以访问该虚拟地址空间了。所有用户模式内存地址都将会使用该页表来进行转换。这使得可以读些这些内存。
.process (Set Process Context)命令具有类似的作用。但是,.context 命令将用户模式地址上下文设置为指定的页目录,而.process 命令会将进程上下文设置为指定进程。在x86处理器上,这两个命令本质上效果是一样的。但是在Itanium处理器上,单个进程可能有不止一个页目录。这种情况下,.process命令要更加有用,因为它会将对页目录的所有访问关联到某个进程。查看进程上下文获得详细信息。
如果正在进行活动调试,除了.context 命令之外还需要执行一个.cache forcedecodeuser命令。这会强制调试器查找需要的内存空间的物理地址。 (这可能很慢,因为会经常造成大量数据必须通过调试电缆传输。)
如果在进行崩溃转储的调试,不需要使用.cache 命令。但是,不能访问当崩溃发生时任何被页换出的用户模式进程的虚拟地址空间。
这里有一个例子。使用!process扩展命令来查找指定进程的页目录基址:
**** NT ACTIVE PROCESS DUMP ****
PROCESS fe5039e0 SessionId: 0 Cid: 0008 Peb: 00000000 ParentCid: 0000
DirBase: 00030000 ObjectTable: fe529b68 TableSize: 50.
Image: System
...
PROCESS fe3c0d60 SessionId: 0 Cid: 0208 Peb: 7ffdf000 ParentCid: 00d4
DirBase: 0011f000 ObjectTable: fe3d0f48 TableSize: 30.
Image: regsvc.exe
现在使用.context命令切换到该页目录基址。
这样就可以通过各种方式来查看内存空间了。例如,这是 !peb 扩展命令的输出:
PEB at 7FFDF000
InheritedAddressSpace: No
ReadImageFileExecOptions: No
BeingDebugged: No
ImageBaseAddress: 01000000
Ldr.Initialized: Yes
Ldr.InInitializationOrderModuleList: 71f40 . 77f68
Ldr.InLoadOrderModuleList: 71ec0 . 77f58
Ldr.InMemoryOrderModuleList: 71ec8 . 77f60
01000000 C:\WINNT\system32\regsvc.exe
77F80000 C:\WINNT\System32\ntdll.dll
77DB0000 C:\WINNT\system32\ADVAPI32.dll
77E80000 C:\WINNT\system32\KERNEL32.DLL
77D40000 C:\WINNT\system32\RPCRT4.DLL
77BE0000 C:\WINNT\system32\secur32.dll
SubSystemData: 0
ProcessHeap: 70000
ProcessParameters: 20000
WindowTitle: 'C:\WINNT\system32\regsvc.exe'
ImageFile: 'C:\WINNT\system32\regsvc.exe'
CommandLine: 'C:\WINNT\system32\regsvc.exe'
DllPath: 'C:\WINNT\system32;.;C:\WINNT\System32;C:\WINNT\system;C:\WINNT;C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;C:\PROGRA~1\COMMON~1\AUTODE~1'
Environment: 0x10000
关于用户模式地址上下文和其他上下文设置的更多信息,查看切换上下文。