我正在使用Visual Studio内核模式调试WDM内核驱动程序IOCTL通过管道调试器串行连接到运行Windows Server 2012 R2的Hyper-V VM。 一旦我在Driver IOControl内部遇到断点,就可以查看用户模式调用堆栈了吗?
目前我只能看到内核堆栈,例如:
SIoctl!SioctlDeviceControl+0x14b [d:\workspace\ioctl\c++\sys\sioctl.c @ 320] C/C++/ASM
nt!IovCallDriver+0x3cd C/C++/ASM
nt!IopXxxControlFile+0x8d2 C/C++/ASM
nt!NtDeviceIoControlFile+0x56 C/C++/ASM
nt!KiSystemServiceCopyEnd+0x13 C/C++/ASM
ntdll!NtDeviceIoControlFile+0xa C/C++/ASM
KERNELBASE!DeviceIoControl+0x73 C/C++/ASM
KERNEL32!DeviceIoControl+0x80 C/C++/ASM
0x9c402408 C/C++/ASM
> 0x0000005e`2f5af9c8 C/C++/ASM
答案 0 :(得分:0)
是的,您需要先切换到所需的流程,然后才能访问它的堆栈。见.process
:
.process
命令指示内核调试器使用特定的用户模式进程作为进程上下文。这种用法有几种效果,但最重要的是调试器可以访问此进程的虚拟地址空间。调试器使用此进程的页表来解释所有用户模式的内存地址,以便您可以读取和写入此内存。注意如果您正在进行实时调试,则应使用
/i
或/p
参数。如果没有这些参数之一,则无法正确显示用户模式或会话内存。/i
参数激活目标进程。使用此选项时,必须执行一次目标才能使此命令生效。如果再次执行,则进程上下文将丢失。/p
参数启用forcedecodeuser设置。 (如果forcedecodeuser选项已处于活动状态,则不必使用/p
。)进程上下文和forcedecodeuser状态仅在目标再次执行之前保持不变。
我知道你问过Visual Studio,我回答了WinDbg。我认为你应该使用适合这项工作的工具。在调试时,WinDbg更加灵活,功能更强大。我认为在VS中你会使用Process context,但我建议再次使用WinDbg。
答案 1 :(得分:0)
我尝试过使用!process 0 0 app.exe然后执行.process / i pid或.process / P id,两者都无法显示用户堆栈。 我认为这是因为我已经在这个过程中,即使认为它在内核驱动程序中,运行的进程也是application.exe。因此,当我查看调用堆栈窗口或键入k时,我只看到内核堆栈。
" Visual studio方式" "切换"对于不同的进程似乎不起作用,我唯一能做的就是遍历不同的堆栈帧(仅在内核堆栈中 - 与调用堆栈窗口中显示的相同)。
我会尝试在WinDbg中进行操作,看看它是否有所不同。
编辑:
我现在做了一些不同的事情,在切换我做的上下文之后!线程然后.thread到出现的一个线程,它现在正在睡眠调用中工作。不知何故,在我的IOCTL中它不起作用。但我现在尝试使用WinDbg并且效果非常好!
非常感谢!