0

我正在使用 Visual Studio 内核模式调试器通过管道串行连接到运行 Windows Server 2012 R2 的 Hyper-V VM 调试 WDM 内核驱动程序 IOCTL。一旦我在 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
4

2 回答 2

0

我已经尝试过使用 !process 0 0 app.exe 然后执行 .process /i pid 或 .process /P id ,两者都无法显示用户堆栈。我想是因为我已经在那个进程中了,甚至以为是在内核驱动里面,运行的进程就是application.exe。因此,当我查看调用堆栈窗口或键入 k 时,我只会看到内核堆栈。

“切换”到不同进程的“Visual Studio 方式”似乎不起作用,我唯一能做的就是绕过不同的堆栈帧(仅在内核堆栈内 - 与调用堆栈窗口中所示相同)。

我将尝试在 WinDbg 中执行此操作,看看是否有任何不同。

编辑:

我现在做了一些不同的事情,在切换上下文之后我做了 !threads 然后 .thread 到出现的一个线程,它现在在睡眠调用中工作。不知何故,在我的 IOCTL 中它不起作用。但我现在使用 WinDbg 进行了尝试,效果非常好!

非常感谢!

于 2014-12-03T16:39:00.940 回答
0

是的,您需要先切换到所需的进程,然后才能访问它的堆栈。见.process

.process命令指示内核调试器使用特定的用户模式进程作为进程上下文。这种用法有几个影响,但最重要的是调试器可以访问此进程的虚拟地址空间。调试器使用此进程的页表来解释所有用户模式内存地址,因此您可以读取和写入此内存。

注意 如果您正在执行实时调试,则应使用/i/p参数。如果没有这些参数之一,您将无法正确显示用户模式或会话内存。该/i参数激活目标进程。使用该选项时,必须执行一次目标,该命令才能生效。如果再次执行,进程上下文将丢失。该/p参数启用 forcedecodeuser 设置。(如果 forcedecodeuser 选项已经处于活动状态,则不必使用/p。)进程上下文和 forcedecodeuser 状态仅保留到目标再次执行。

我知道您询问了 Visual Studio,而我回答了有关 WinDbg 的问题。我认为你应该使用适合这项工作的工具。WinDbg 在调试方面更加灵活和强大。我认为在 VS 中你会使用Process context,但我会再次推荐使用 WinDbg。

于 2014-12-03T12:26:15.717 回答