Skip to content

0.19 加载nt模块符号信息失败后的排查

https://scz.617.cn/windows/201707191800.txt

A: scz 2017-07-19

$ echo %_NT_SYMBOL_PATH% x:\sym;srvx:\symhttp://msdl.microsoft.com/download/symbols

kd远程调试x64/Win7,发现nt模块的符号表未能加载,".reload /f nt"未能解决问 题。"symchk /v ntoskrnl.exe"也未能解决问题。一度怀疑微软没有提供相应版本的 符号文件。观察symchk的输出,知道它应该去找:

x:\sym\ntkrnlmp.pdb\90A825EBE124425398C40A24AD0F9F662\ntkrnlmp.pdb

手工检查,发现已经存在目录

x:\sym\ntkrnlmp.pdb\90A825EBE124425398C40A24AD0F9F662\

但其下只有

x:\sym\ntkrnlmp.pdb\90A825EBE124425398C40A24AD0F9F662\ntkrnlmp.pd_

删掉目录

x:\sym\ntkrnlmp.pdb\90A825EBE124425398C40A24AD0F9F662\

重新

symchk /v ntoskrnl.exe

成功解决问题。后来想了想,猜测是dbghelp.dll的处理流程有问题,检测到相应 *.pd_存在就不再尝试远程下载;而我这里不知何故,前次下载符号文件过程异常中 止,只下到了ntkrnlmp.pd_,并未完成解压释放;后果是,dbghelp.dll再也不会下 载并析取出ntkrnlmp.pdb。

考虑到这种现象可能不仅限于nt模块,在"x:\sym\"下搜索".pd_",果然找到另外一 些未解压的符号文件。对于这种情况,不必删除子目录重新远程下载,直接用7-Zip 析取.pdb即可。存在另一种情况,.pd_本身就没下载完整,这肯定是网络故障导致 的,对此只能删除*.pd_或子目录重新下载。

针对我所碰上的情况,如下命令并不能得到期望中的有效提示:

!sym noisy dbh.exe -s:"x:\sym;srvx:\symhttp://msdl.microsoft.com/download/symbols" ntoskrnl.exe info dbh.exe ntoskrnl.exe info

顺便说一下如何手工下载指定文件的符号文件:

$ dbh.exe ntoskrnl.exe info | find "PdbSig70"

    PdbSig70 : 0x90a825eb, 0xe124, 0x4253, 0x98, 0xc4, 0x0a, 0x24, 0xad, 0x0f, 0x9f, 0x66

$ dumpbin /headers ntoskrnl.exe | find ".pdb"

56F579F0 cv 25 0019F27C 19E87C Format: RSDS, {90A825EB-E124-4253-98C4-0A24AD0F9F66}, 2, ntkrnlmp.pdb

$ curl -I -A "Microsoft-Symbol-Server/9.9.9.9" http://msdl.microsoft.com/download/symbols/ntkrnlmp.pdb/90A825EBE124425398C40A24AD0F9F662/ntkrnlmp.pd_

$ curl -A "Microsoft-Symbol-Server/9.9.9.9" -o ntkrnlmp.cab http://msdl.microsoft.com/download/symbols/ntkrnlmp.pdb/90A825EBE124425398C40A24AD0F9F662/ntkrnlmp.pd_

解压ntkrnlmp.cab,析取ntkrnlmp.pdb。

D: scz 2018-03-07 16:10

$ curl -I -A "Microsoft-Symbol-Server/9.9.9.9" http://msdl.microsoft.com/download/symbols/ntkrnlmp.pdb/90A825EBE124425398C40A24AD0F9F662/ntkrnlmp.pd_

这个已经404了,究其原因,发现服务端已不提供".pd_",而是直接提供".pdb"

$ curl -I -A "Microsoft-Symbol-Server/10.0.0.0" http://msdl.microsoft.com/download/symbols/ntkrnlmp.pdb/90A825EBE124425398C40A24AD0F9F662/ntkrnlmp.pdb

D: scz 2023-06-16

过去是在_NT_SYMBOL_PATH中搜".pd_",现在搜".error",搜到后全部删除。