符号文件路径设置
什么是符号文件
默认情况下,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
。经过百度后可以确认,微软的符号文件下载经过了一次重定向,重定向的地址被长城拦截掉了。因此导致无法下载。
解决方案
-
配置代理
该方案需要配置 http/https 代理。据悉,socket5 代理无法下载符号文件。因为笔者这边需要下载符号文件提供给其他人使用,因此,笔者采用的是
python
代码下载。 -
使用 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
中了
-
网友评论