符號(hào)文件路徑設(shè)置
什么是符號(hào)文件
默認(rèn)情況下惶看,release 后的 exe 或 dll 都是無(wú)符號(hào)的启泣。沒(méi)有符號(hào)阵子,就無(wú)法調(diào)試應(yīng)用程序政基,很多時(shí)候客戶機(jī)器上產(chǎn)生了崩潰就無(wú)法確定問(wèn)題原因贞铣。這時(shí)候,就需要使用 windows 提供的 pdb 文件來(lái)解決該問(wèn)題沮明。
PDB(Program Database)辕坝,是微軟開(kāi)發(fā)的用于存儲(chǔ)程序調(diào)試信息的文件格式,在編譯期生成荐健,存儲(chǔ)了源文件名稱酱畅,變量名,函數(shù)名江场,F(xiàn)PO(幀指針)圣贸,對(duì)應(yīng)行號(hào)等信息。
配置符號(hào)文件
配置符號(hào)文件的方式有很多種扛稽。下面以在 windbg 中的配置為例吁峻。
-
命令行輸入
在 windbg 的命令行中輸入:
0:040> .sympath SRV*c:\符號(hào)文件路徑*http://msdl.microsoft.com/download/symbols 0:040> .reload
-
在 Symbol Search Path 窗口中輸入
選擇
File
->Symbol Search Path
后輸入:SRV*c:\符號(hào)文件路徑*http://msdl.microsoft.com/download/symbols
,復(fù)選reload
在张,點(diǎn)擊OK
用含。 -
修改環(huán)境變量
計(jì)算機(jī)右鍵 ->
高級(jí)系統(tǒng)設(shè)置
->高級(jí)
->環(huán)境變量
中創(chuàng)建新的變量。變量名為_NT_SYMBOL_PATH
帮匾,值為SRV*c:\符號(hào)文件路徑*http://msdl.microsoft.com/download/symbols
Windbg 下載符號(hào)文件失敗的解決方案
最近嘗試使用 windbg 解析 c++ 的 dump 后發(fā)現(xiàn)啄骇,無(wú)論如何都無(wú)法解析,提示找不到符號(hào)文件瘟斜。嘗試在命令行中輸入以下命令:
0:040> !sym noisy
0:040> .reload /f
執(zhí)行上面的命令后發(fā)現(xiàn)缸夹,網(wǎng)絡(luò)連接失敗了。 SYMSRV: HttpSendRequest: 800C2EFD - ERROR_INTERNET_CANNOT_CONNECT
螺句。經(jīng)過(guò)百度后可以確認(rèn)虽惭,微軟的符號(hào)文件下載經(jīng)過(guò)了一次重定向,重定向的地址被長(zhǎng)城攔截掉了蛇尚。因此導(dǎo)致無(wú)法下載芽唇。
解決方案
-
配置代理
該方案需要配置 http/https 代理。據(jù)悉取劫,socket5 代理無(wú)法下載符號(hào)文件匆笤。因?yàn)楣P者這邊需要下載符號(hào)文件提供給其他人使用,因此谱邪,筆者采用的是
python
代碼下載炮捧。 -
使用 python下載 pdb 文件
-
配置命令行代理
set http_proxy=http://127.0.0.1:1189 set https_proxy=http://127.0.0.1:1189
-
安裝好 python3 運(yùn)行環(huán)境,在桌面新建
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()
-
打開(kāi)
winddbg
, 執(zhí)行以下代碼后灌砖,保存錯(cuò)誤的日志為windbg.log
0:040> !sym noisy 0:040> .reload /f`
新建
downloads
文件夾在 cmd 中執(zhí)行
python3.exe run.py
后,等待結(jié)束傀蚌,符號(hào)文件就下載到downloads
中了
-