最近在 Windows 下调试程序时,发现无法下载微软提供的调试符号了(提示 E_PDB_NOT_FOUND
),一开始以为是微软自己的原因,因为以往的经验表明,微软在 Patch Tuesday 之后的一段时间里可能就是无法正常下载调试符号。
后来发现,这次是无法从微软的服务器下载任何调试符号,比如使用 WinDbg 自带的 symchk.exe
无法给 System32 目录下的任一文件下载调试符号,而且在不同的机器上(拥有不同的代理上网环境)均不能下载调试符号,这就非常奇怪了。
笔者在某不存在的社交网站上反应了这个问题,有网友表示需要使用 VPN,也有网友表示需要绕过长城,还有网友表示 VPN 也不解决问题,而国外友人则表示完全不存在这个问题!很显然,这跟国内复杂的网络环境不无关系!
笔者打开了 Wireshark,想看看从微软的服务器下载调试符号时到底发生了什么。比如,在给 Notepad 下载调试符号时,后台访问的 URL 如下:
1 | https://msdl.microsoft.com/download/symbols/notepad.pdb/BC0D363AF49A0E2C05B06DA4535DA0C71/notepad.pdb |
接着会重定向到以下地址:
1 | https://vsblobprodscussu5shard60.blob.core.windows.net/b-4712e0edc5a240eabf23330d7df68e77/F6311B221044787072987B74992D6DE770FCBBFED09C2853B4F10350CB964FF900.blob?sv=2017-04-17&sr=b&si=1&sig=ulHtMVJpGWuEvNczzOR6J3g2rXS1s9qwwmEqJ1x63wg%3D&spr=https&se=2020-02-24T01%3A57%3A40Z&rscl=x-e2eid-66439cf8-65874550-b9c5b293-e8bf7391-session-627c05ca-398743d1-b7a6ab61-b0fbc28f |
Chrome 提示 ERR_CONNECTION_RESET
,显然 vsblobprodscussu5shard60.blob.core.windows.net
被 Block 了。那为什么此时代理不管用了呢?而代理服务器本身是可以正常访问这个地址的,或者说,基于代理服务器上的 VPN 也可以正常访问这个地址。
后来发现,笔者使用的是 PAC 代理上网模式(Proxy Auto-Config,代理自动配置),上网流量要不要经过代理服务器是根据 PAC 规则文件来定的(相对全局代理模式更加智能),而 windows.net
并没有出现在一些流行的 PAC 规则文件中,因此这里无法正常下载调试符号文件。
解决方案非常简单,给 PAC 规则文件增加一条记录 .windows.net
,表示支持 windows.net
下所有地址的访问。