我遇到以下情况:我正处于实时用户模式调试会话中,我想显示win32k!_W32Process
结构。不幸的是,win32k是一个内核模式SYS文件,因此这些符号在用户模式会话中不可用。
我知道我总是可以将DLL,EXE或SYS作为转储文件加载,然后检查符号。通常我会通过File / Open Crash Dump来做到这一点。
这一次,我想向调试研讨会的参与者展示可以同时调试多个系统,所以我通过WinDbg的命令提示符打开了Win32K.sys:
0:003> |
. 0 id: 10fc attach name: [...]\NetHeaps.exe
0:003> .opendump C:\Windows\winsxs\[...]\win32k.sys
Loading Dump File [C:\Windows\winsxs\[...]\win32k.sys]
Opened 'C:\Windows\winsxs\[...]\win32k.sys'
||0:0:003>
我们现在可以看到,我们有两个系统,我目前正在使用实时调试系统:
||0:0:003> ||
. 0 Live user mode: <Local>
1 Image file: C:\Windows\winsxs\[...]\win32k.sys
我以为我现在可以切换到另一个系统,但这不起作用:
||0:0:003> ||1s
^ Illegal debuggee error in '||1s'
我不会太担心,但在这种情况下找不到win32k
的符号:
||0:0:003> .reload
Reloading current modules
...........................
||0:0:003> dt win32k!_W32Process
Symbol win32k!_W32Process not found.
答案 0 :(得分:2)
问题不在||
命令中,而是在.opendump
命令中。
帮助说:
使用.opendump命令后,必须使用g(Go)命令完成转储文件的加载。
请注意,这也会运行您的实时流程。因此,首先冻结线程(~*f
)并稍后解冻(~*u
)。
之后,您可以切换系统并显示类型:
||1:1:004> ||
0 Live user mode: <Local>
. 1 Image file: C:\Windows\winsxs\[...]\win32k.sys
||1:1:004> dt _W32Process
win32k!_W32PROCESS
+0x000 Process : Ptr64 _EPROCESS
+0x008 RefCount : Uint4B
+0x00c W32PF_Flags : Uint4B
[...]