0.19 加载nt模块符号信息失败后的排查 https://scz.617.cn/windows/201707191800.txt A: scz 2017-07-19 $ echo %_NT_SYMBOL_PATH% x:\sym;srv*x:\sym*http://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;srv*x:\sym*http://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",搜到后全部删除。