2023年12月13日发(作者:)
Windbg无法下载pdb的解决方法
符号文件路径设置
什么是符号文件
默认情况下,release 后的 exe 或 dll 都是无符号的。没有符号,就无法调试应用程序,很多时候客户机器上产生了崩溃就无法确定问题原因。
这时候,就需要使用 windows 提供的 pdb 文件来解决该问题。
PDB(Program Database),是微软开发的用于存储程序调试信息的文件格式,在编译期生成,存储了源文件名称,变量名,函数
名,FPO(帧指针),对应行号等信息。
配置符号文件
配置符号文件的方式有很多种。下面以在 windbg 中的配置为例。
命令行输入
在 windbg 的命令行中输入:
0:040> .sympath SRV*c:符号文件路径*/download/symbols
0:040> .reload
在 Symbol Search Path 窗口中输入
修改环境变量
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=127.0.0.1:1189
set https_proxy=127.0.0.1:1189
安装好 python3 运行环境,在桌面新建
test
文件夹,保存下面的代码为
。
#!/usr/bin/env python
import requests
from import urljoin
import os
import logging
LOG_LEVEL =
def download_file_by_curl(url, outdir, filename):
newpath = ('./downloads/',e(outdir))
(newpath)
('mkdir -p %s;'%newpath)
('cd %s;curl -OL %s'%(newpath,url))
def main():
filename = ""
outdir = './downloads/'
= '/'
with open(filename, 'r') as fp:
content = nes()
for rline in content:
line = ()
if with('SYMSRV: HTTPGET:'):
m = (': ')
url =urljoin(main_url, m[2])
pdb_name = m[2][len('/download/symbols/'):]
("{} {}".format(url, pdb_name))
download_file_by_curl(url, pdb_name, filename)
if __name__ == '__main__':
onfig(format='%(asctime)stFile "%(filename)s",line %(lineno)st%(levelname)s: %(message)s', level=LOG_LEVEL)
main()
打开
winddbg
, 执行以下代码后,保存错误的日志为
0:040> !sym noisy
0:040> .reload /f`
新建
downloads
文件夹
在 cmd 中执行
后,等待结束,符号文件就下载到
downloads
中了


发布评论