Windbg 无法下载 pdb 的解决方法

符号文件路径设置

什么是符号文件

默认情况下,release 后的 exe 或 dll 都是无符号的。没有符号,就无法调试应用程序,很多时候客户机器上产生了崩溃就无法确定问题原因。这时候,就需要使用 windows 提供的 pdb 文件来解决该问题。

PDB(Program Database),是微软开发的用于存储程序调试信息的文件格式,在编译期生成,存储了源文件名称,变量名,函数名,FPO(帧指针),对应行号等信息。

配置符号文件

配置符号文件的方式有很多种。下面以在 windbg 中的配置为例。

  • 命令行输入

    在 windbg 的命令行中输入:

    0:040> .sympath SRV*c:\符号文件路径*http://msdl.microsoft.com/download/symbols
    0:040> .reload
    
  • 在 Symbol Search Path 窗口中输入

    选择 File -> Symbol Search Path 后输入: SRV*c:\符号文件路径*http://msdl.microsoft.com/download/symbols,复选 reload,点击 OK

  • 修改环境变量

    计算机右键 -> 高级系统设置 -> 高级 -> 环境变量中创建新的变量。变量名为 _NT_SYMBOL_PATH,值为 SRV*c:\符号文件路径*http://msdl.microsoft.com/download/symbols

Windbg 下载符号文件失败的解决方案

最近尝试使用 windbg 解析 c++ 的 dump 后发现,无论如何都无法解析,提示找不到符号文件。尝试在命令行中输入以下命令:

0:040> !sym noisy
0:040> .reload /f

执行上面的命令后发现,网络连接失败了。 SYMSRV: HttpSendRequest: 800C2EFD - ERROR_INTERNET_CANNOT_CONNECT。经过百度后可以确认,微软的符号文件下载经过了一次重定向,重定向的地址被长城拦截掉了。因此导致无法下载。

解决方案

  1. 配置代理

    该方案需要配置 http/https 代理。据悉,socket5 代理无法下载符号文件。因为笔者这边需要下载符号文件提供给其他人使用,因此,笔者采用的是 python 代码下载。

  2. 使用 python下载 pdb 文件

    • 配置命令行代理

      set http_proxy=http://127.0.0.1:1189
      set https_proxy=http://127.0.0.1:1189   
      
    • 安装好 python3 运行环境,在桌面新建 test 文件夹,保存下面的代码为 run.py

      #!/usr/bin/env python
      import requests
      from urllib.parse import urljoin
      import os
      import logging
      
      LOG_LEVEL = logging.DEBUG
      def download_file_by_curl(url, outdir, filename):
          newpath =  os.path.join('./downloads/',os.path.dirname(outdir))
          logging.info(newpath)
          os.system('mkdir -p %s;'%newpath)
          os.system('cd %s;curl -OL %s'%(newpath,url))
      def main():
          filename = "windbg.log"
          outdir = './downloads/'
           = 'https://msdl.microsoft.com/'
          with open(filename, 'r') as fp:
              content = fp.readlines()
              for rline in content:
                  line = rline.strip()
                 if line.startswith('SYMSRV:  HTTPGET:'):
                     m = line.split(': ')
                     url =urljoin(main_url, m[2])
                      pdb_name = m[2][len('/download/symbols/'):]
                      logging.info("{} {}".format(url, pdb_name))
                      download_file_by_curl(url, pdb_name, filename)
      if __name__ == '__main__':
          logging.basicConfig(format='%(asctime)s\tFile \"%(filename)s\",line %(lineno)s\t%(levelname)s: %(message)s', level=LOG_LEVEL)
          main()
      
    • 打开 winddbg, 执行以下代码后,保存错误的日志为 windbg.log

      0:040> !sym noisy
      0:040> .reload /f`          
      
    • 新建 downloads 文件夹

    • 在 cmd 中执行 python3.exe run.py 后,等待结束,符号文件就下载到 downloads 中了

你可能感兴趣的:(Windbg 无法下载 pdb 的解决方法)