【问题标题】:Why can’t windbg display my user-mode call stack in a kernel mode dump?为什么windbg 不能在内核模式转储中显示我的用户模式调用堆栈?
【发布时间】:2020-10-31 21:52:56
【问题描述】:

我用 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 调试器,但我有另一个没有调试器的调试器,也好不到哪里去。

有趣的是,如果我选择了在崩溃期间运行的其他进程,并且碰巧遇到了一个未分页的进程(例如 firefox),它们的调用堆栈也会以 nt!KiSystemServiceCopyEnd+0x28 结束。

如何在崩溃期间检索程序的状态?

【问题讨论】:

  • 是不同的转储类型 - 完整内存、仅内核内存、迷你转储。你不要说 - 什么转储类型(windbg 在开始时写这个)。可能你有内核内存转储或迷你转储。在这种情况下,用户模式内存根本不包括转储,也不可能显示任何用户模式堆栈
  • 确实:Kernel Bitmap Dump File: Kernel address space is available, User address space may not be available. 输出是压倒性的,我想......你想发布这个作为答案吗?
  • 在这种情况下 - 转储中没有用户空间内存并且不可能显示用户模式堆栈。但什么是蓝屏死机?您的用户模式代码是否导致蓝屏死机?!或崩溃在内核中?发生了什么?或者这是关键进程终止崩溃?
  • 这绝对是我的用户模式调用。没有蓝屏,但系统挂起几秒钟并转储内核。之后它确实会正常继续,所以我认为它遇到了一个非关键的断言或其他东西。我想了解程序状态,以便可靠地重现它。
  • @ThomasWeller 可能,但是 a) 机器没有任何其他转储的迹象; b) 通过至少 4 次图形驱动程序更新问题仍然存在; c) 我在一台非常不同的机器上观察到类似的行为,我将在本周末重新访问。

标签: c++ debugging winapi windbg


【解决方案1】:

RbMm 是正确的 - 转储不包含任何用户地址空间,因此 windbg 没有任何内容可显示。

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

【讨论】:

  • 可能内存量受“常规”内核转储设置的影响。如果您将其更改为“完整内核转储”,您可能会得到您想要的信息
  • @andI'msureI'mmissingsome 我也希望如此,并将设置更改为完成。需要几周时间才能知道,因为这个问题非常罕见。 FWIW,转储由 nt!DbgkWerCaptureLiveKernelDump → nt!DbgkpWerProcessPolicyResult → nt!DbgkpWerCaptureLiveFullDump 编写——如果有人知道哪些设置会影响它,我很乐意学习。
  • 根据this analysisDbgkWerCaptureLiveKernelDump 在几天内最多写入一个故障转储。所以有可能我一直在进行错误检查,但内核实际上只在两周内生成了一个转储文件。这根本无助于减少问题:-(我想我会透露细节。
猜你喜欢
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 2014-04-10
相关资源
最近更新 更多