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

中了