是否存在与 Windows 7 个内核符号相关的已知问题?
Is there a known issue relating to Windows 7 Kernel Symbols?
我有几台 Windows 7 台机器,我无法读取它们的内存转储。我发现了一些我怀疑可能相关但不确定的东西:
https://twitter.com/aionescu/status/634028737458114560
我还发现了这个:http://support.microsoft.com/kb/2528507
但是,在我的任何转储中都没有看到文档中给出的关于 wow64exts 的场景消息。我现在也无法应用该修补程序来测试它。所以我只是在寻找更多信息或意见。
我能够打开任何其他 OS 转储以及我自己系统的 Windows 7 转储,但是还有 2 台其他机器 运行 Win 7 并且它告诉我有错误的内核符号。
我尝试清除我的符号缓存,重新安装 Windows SDK,并尝试在另外两台机器上打开转储,结果相同。如果重要,崩溃是使用滚动锁定方法手动创建的。
符号路径:SRV*c:\symbols*http://msdl.microsoft.com/download/symbols;
看到这些错误:后跟 "Type referenced: nt!_KPRCB"
有谁知道 Alex 在推特上提到的问题 link 以及它是否可能与我所看到的有关?
2015-10-22更新:
随着 Microsoft 补丁日 (2015-10-13) 和 KB3088195,符号再次可用。
然而,尚未提供损坏版本的符号,因此以下内容可能仍然有用。
Microsoft 过去已经为 ntdll
发布了 "good" 个符号,其中包含 _TEB
或 _KPRCB
等类型信息。从 2015 年 7 月中旬开始,Microsoft 仍然发布了 ntdll
的符号,但不包含该信息。
所以是否获取类型信息取决于ntdll
的版本。引用旧版本 ntdll
的旧转储将下载包含类型信息的旧 PDB,而新转储引用 ntdll
的新版本并且 WinDbg(或任何其他调试器)下载没有类型信息的 PDB。
Microsoft 能否追溯删除 "good" 符号的类型信息,从而使它们成为 "bad"?
是的。如 中所述,有一个工具可以从现有 PDB 中删除类型信息。这样做并更换PDB会导致这样的效果。
Microsoft 可以发布当前 "bad" 的那些 PDB 的 "good" 版本吗?
这很难说,因为我们不知道微软是否保留了 "good" 版本的副本,以便他们可以用 [=72] 替换符号服务器上的 "bad" 版本=] 一个。从相同的源代码重建 ntdll
并因此创建新的 PDB 听起来是可能的,但 PDB 会获得新的时间戳和校验和。这可能可以手动更正,尤其是 Microsoft,因为他们应该了解 PDB 内部格式,但恕我直言,他们不太可能这样做。事情可能会出错,MS 几乎不会有测试来保证这种事情的正确性。
那我该怎么办呢?
恕我直言,您无法真正纠正这种情况。
您可以假设 ntdll
中的类型变化不大。这将允许您使用旧版本的 wntdll.pdb
和新版本的 ntdll.dll
并对其应用 ChkMatch -m。这会将时间戳和校验和从 DLL 复制到 PDB。在你这样做之后(在一个空文件夹中),将符号目录中现有的 wntdll.pdb
替换为被黑的
WinDbg 演练(输出缩短为相关内容)。我正在使用我可以在我的 PC 上找到的最新版本 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.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
覆盖新的。
根据 Microsoft 的说法,该问题现已解决,Microsoft 告诉我您应该清除符号缓存以获取新的 PDB,否则 Windbg 将使用遗漏信息的旧符号。
我有几台 Windows 7 台机器,我无法读取它们的内存转储。我发现了一些我怀疑可能相关但不确定的东西:
https://twitter.com/aionescu/status/634028737458114560
我还发现了这个:http://support.microsoft.com/kb/2528507
但是,在我的任何转储中都没有看到文档中给出的关于 wow64exts 的场景消息。我现在也无法应用该修补程序来测试它。所以我只是在寻找更多信息或意见。
我能够打开任何其他 OS 转储以及我自己系统的 Windows 7 转储,但是还有 2 台其他机器 运行 Win 7 并且它告诉我有错误的内核符号。
我尝试清除我的符号缓存,重新安装 Windows SDK,并尝试在另外两台机器上打开转储,结果相同。如果重要,崩溃是使用滚动锁定方法手动创建的。
符号路径:SRV*c:\symbols*http://msdl.microsoft.com/download/symbols;
看到这些错误:后跟 "Type referenced: nt!_KPRCB"
有谁知道 Alex 在推特上提到的问题 link 以及它是否可能与我所看到的有关?
2015-10-22更新:
随着 Microsoft 补丁日 (2015-10-13) 和 KB3088195,符号再次可用。
然而,尚未提供损坏版本的符号,因此以下内容可能仍然有用。
Microsoft 过去已经为 ntdll
发布了 "good" 个符号,其中包含 _TEB
或 _KPRCB
等类型信息。从 2015 年 7 月中旬开始,Microsoft 仍然发布了 ntdll
的符号,但不包含该信息。
所以是否获取类型信息取决于ntdll
的版本。引用旧版本 ntdll
的旧转储将下载包含类型信息的旧 PDB,而新转储引用 ntdll
的新版本并且 WinDbg(或任何其他调试器)下载没有类型信息的 PDB。
Microsoft 能否追溯删除 "good" 符号的类型信息,从而使它们成为 "bad"?
是的。如
Microsoft 可以发布当前 "bad" 的那些 PDB 的 "good" 版本吗?
这很难说,因为我们不知道微软是否保留了 "good" 版本的副本,以便他们可以用 [=72] 替换符号服务器上的 "bad" 版本=] 一个。从相同的源代码重建 ntdll
并因此创建新的 PDB 听起来是可能的,但 PDB 会获得新的时间戳和校验和。这可能可以手动更正,尤其是 Microsoft,因为他们应该了解 PDB 内部格式,但恕我直言,他们不太可能这样做。事情可能会出错,MS 几乎不会有测试来保证这种事情的正确性。
那我该怎么办呢?
恕我直言,您无法真正纠正这种情况。
您可以假设 ntdll
中的类型变化不大。这将允许您使用旧版本的 wntdll.pdb
和新版本的 ntdll.dll
并对其应用 ChkMatch -m。这会将时间戳和校验和从 DLL 复制到 PDB。在你这样做之后(在一个空文件夹中),将符号目录中现有的 wntdll.pdb
替换为被黑的
WinDbg 演练(输出缩短为相关内容)。我正在使用我可以在我的 PC 上找到的最新版本 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.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
覆盖新的。
根据 Microsoft 的说法,该问题现已解决,Microsoft 告诉我您应该清除符号缓存以获取新的 PDB,否则 Windbg 将使用遗漏信息的旧符号。