美文网首页
Windbg 无法下载 pdb 的解决方法

Windbg 无法下载 pdb 的解决方法

作者: l蓝色梦幻 | 来源:发表于2020-05-27 09:35 被阅读0次

    符号文件路径设置

    什么是符号文件

    默认情况下,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 的解决方法

          本文链接:https://www.haomeiwen.com/subject/pfiiahtx.html