为什么 windbg 不能在内核模式转储中显示我的用户模式调用堆栈?

Why can’t windbg display my user-mode call stack in a kernel mode dump?

我用 Visual C++ 编写了一个程序,但它崩溃了 Windows。幸运的是,我有一个崩溃转储!

!analyze -v 声明错误进程确实是我的程序,并向我展示了一个内核模式调用堆栈。但是,我需要了解我的用户模式程序的状态才能理解它。

根据此处的一些其他答案(例如 this one),它应该可以正常工作。

但我无法从 windbg 中获得任何此类信息。所有调用堆栈都简单地以 nt!KiSystemServiceCopyEnd+0x28 结束。作为一个最小的例子,标准 Win32 线程池中我的一个空闲工作线程的调用堆栈:

nt!KiSwapContext+0x76
nt!KiSwapThread+0xbfd
nt!KiCommitThreadWait+0x144
nt!KeRemoveQueueEx+0x27e
nt!IoRemoveIoCompletion+0x99
nt!NtWaitForWorkViaWorkerFactory+0x25e
nt!KiSystemServiceCopyEnd+0x28 (TrapFrame @ ffff820d`2a2dfb00)
0x00007ff8`08a1fa54

我至少希望 RtlUserThreadStart 某个地方,但什么也看不到。

有问题的程序是在 Visual C++ 2019 for x64 中编译的,带有调试信息。程序和 PDB 文件仍然存在,自崩溃以来未受任何影响。 Visual Studio 调试器是在崩溃时附加的,但我有另一个没有调试器的,它也好不到哪儿去。

有趣的是,如果我 select 在崩溃期间 运行 的其他进程,并且如果我碰巧遇到了一个没有被调出的进程(例如 firefox),它们的调用栈结束于 nt!KiSystemServiceCopyEnd+0x28 还有。

我该怎么做才能在崩溃期间恢复我的程序状态?

RbMm 是对的 – 转储不包含任何用户地址 space,因此 windbg 没有显示任何内容。

用 windbg 打开转储文件时,注意输出的前几行。应该有一条消息,如 Kernel Bitmap Dump File: Kernel address space is available, User address space may not be available,说明了一切。