debugging - 是否存在与 Windows 7 内核符号相关的已知问题?

标签 debugging windows-7 windbg symbols debug-symbols

我有几台 Windows 7 机器,我无法读取它们的内存转储。我发现了一些我怀疑可能相关的东西,但不是肯定的:

https://twitter.com/aionescu/status/634028737458114560

我还发现了这个:http://support.microsoft.com/kb/2528507

但是,在我的任何转储中都没有看到文档中给出的有关 wow64exts 的场景消息。我目前也无法应用该修补程序来测试它。所以我只是在寻找更多信息或意见。

我可以打开任何其他操作系统转储以及我自己系统的 Windows 7 转储,但是还有另外两台运行 Win 7 的机器,它告诉我我有错误的内核符号。

我尝试清除符号缓存,重新安装 Windows SDK,并尝试在其他两台机器上打开转储,结果相同。如果重要,崩溃是使用滚动锁定方法手动创建的。

符号路径:SRV*c:\symbols*http://msdl.microsoft.com/download/symbols;
看到这些错误:后面跟着“引用的类型:nt!_KPRCB”

有没有人知道亚历克斯在推特链接中提到的问题,以及它是否可能与我所看到的有关?

最佳答案

2015-10-22 更新:

随着微软补丁日 (2015-10-13) 和 KB3088195 , 符号再次可用。

但是,尚未提供损坏版本的符号,因此下面可能仍然有用。

Microsoft 已经发布了 ntdll 的“好”符号。过去,包含类型信息,如 _TEB_KPRCB .从 2015 年 7 月中旬开始,微软仍然发布了 ntdll 的符号。 ,但不包含该信息。

所以这取决于ntdll的版本无论您是否获得类型信息。旧转储引用旧版本 ntdll将下载包含类型信息的旧 PDB,而新转储将引用 ntdll 的新版本和 WinDbg(或任何其他调试器)下载没有类型信息的 PDB。

微软是否可以追溯删除“好”符号的类型信息,从而使它们“坏”?

是的。如 this answer 中所述,有一个工具可以从现有的 PDB 中删除类型信息。这样做并替换 PDB 会导致这种效果。

Microsoft 能否发布当前“坏”的那些 PDB 的“好”版本?

这很难说,因为我们不知道微软是否保留了“好”版本的副本,以便他们可以用“好”版本替换符号服务器上的“坏”版本。重建ntdll从相同的源代码创建新的 PDB 听起来是可能的,但 PDB 会获得一个新的时间戳和校验和。这可能可以手动更正,尤其是 Microsoft,因为他们应该了解 PDB 内部格式,但恕我直言,他们不太可能这样做。事情可能会出错,MS 几乎不会有测试来保证这种事情的正确性。

那我能做什么?

恕我直言,您无法真正纠正这种情况。

您可以假设 ntdll 中的类型没有改变这么多。这将允许您使用旧版本的 wntdll.pdb以及ntdll.dll的新版本并申请 ChkMatch -m到它。这会将时间戳和校验和从 DLL 复制到 PDB。完成后(在一个空文件夹中),替换现有的 wntdll.pdb在您的符号目录中与被黑的一个。

WinDbg 演练(输出缩短为相关内容)。我正在使用最新版本的 wntdll.pdb我可以在我的电脑上找到。

警告:执行以下操作可能会修复类型信息,但可能会破坏调用堆栈的正确性。由于实现中的任何更改(可能用于安全修复)都会更改方法偏移量。

0:005> dt nt!_PEB
*************************************************************************
***                                                                   ***
***    Either you specified an unqualified symbol, or your debugger   ***
...
***    Type referenced: nt!_PEB                                       ***
***                                                                   ***
*************************************************************************
Symbol nt!_PEB not found.

0:005> lm m ntdll
start    end        module name
773f0000 77570000   ntdll      (pdb symbols)          e:\debug\symbols\wntdll.pdb\FA9C48F9C11D4E0894B8970DECD92C972\wntdll.pdb

0:005> .shell cmd /c copy C:\Windows\SysWOW64\ntdll.dll e:\debug\temp\ntdllhack\ntdll.dll
        1 file(s) copied.

0:005> .shell cmd /c copy "E:\Windows SDk\8.0\Debuggers\x86\sym\wntdll.pdb\B081677DFC724CC4AC53992627BEEA242\wntdll.pdb" e:\debug\temp\ntdllhack\wntdll.pdb
        1 file(s) copied.

0:005> .shell cmd /c E:\debug\temp\ntdllhack\chkmatch.exe -m E:\debug\temp\ntdllhack\ntdll.dll E:\debug\temp\ntdllhack\wntdll.pdb
...
Executable: E:\debug\temp\ntdllhack\ntdll.dll 
Debug info file: E:\debug\temp\ntdllhack\wntdll.pdb 

Executable: 
TimeDateStamp: 55a69e20 
Debug info: 2 ( CodeView ) 
TimeStamp: 55a68c18  Characteristics: 0  MajorVer: 0  MinorVer: 0 
Size: 35  RVA: 000e63e0  FileOffset: 000d67e0  
CodeView format: RSDS 
Signature: {fa9c48f9-c11d-4e08-94b8-970decd92c97}  Age: 2  
PdbFile: wntdll.pdb 
Debug info: 10 ( Unknown ) 
TimeStamp: 55a68c18  Characteristics: 0  MajorVer: 565  MinorVer: 6526 
Size: 4  RVA: 000e63dc  FileOffset: 000d67dc  

Debug information file: 
Format: PDB 7.00 
Signature: {b081677d-fc72-4cc4-ac53-992627beea24}  Age: 4 

Writing to the debug information file... 
Result: Success.

0:005> .shell cmd /c copy E:\debug\temp\ntdllhack\wntdll.pdb E:\debug\symbols\wntdll.pdb\FA9C48F9C11D4E0894B8970DECD92C972\wntdll.pdb
        1 file(s) copied.

0:005> .reload
Reloading current modules
.............................

0:005> dt nt!_PEB
ntdll!_PEB
   +0x000 InheritedAddressSpace : UChar
   +0x001 ReadImageFileExecOptions : UChar
...

0:005> !heap -s
LFH Key                   : 0x219ab08b
Termination on corruption : DISABLED
  Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast 
                    (k)     (k)    (k)     (k) length      blocks cont. heap 
-----------------------------------------------------------------------------
Virtual block: 00920000 - 00920000 (size 00000000)
Virtual block: 02c60000 - 02c60000 (size 00000000)
Virtual block: 02e10000 - 02e10000 (size 00000000)
...

注意:使用 ChkMatch这样的好处是不需要开启.symopt- 100 ,因为该选项会影响所有 PDB 文件,并且您不会发现潜在的其他符号问题。如果您不介意使用 .symopt ,你可以简单地复制一个旧的 wntdll.PDB在新的。

关于debugging - 是否存在与 Windows 7 内核符号相关的已知问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32278634/

相关文章:

java - 编译算法 NetBeans Java

windows - 在 Windows 7/2008 R2 上有时不发送套接字消息

WinDbg TTD : No trace files were identified from this record session

c - 如何在 Windbg 中打印 C 结构的数据

windows - Application Verifier 自动创建过程转储文件

c++ - 如何在调试时观察多个变量而不在断点处停止?

visual-studio - 是否可以实现 GC.GetAliveInstancesOf<T>() (用于调试)?

java - 合并排序错误的输出

swift - 无法使用 Open in... 打开文件,因为 Xcode 9.3

wpf - 将 Windows 7 屏幕键盘合并到 WPF 应用程序中