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",搜到后全部删除。