符號(hào)文件路徑設(shè)置
什么是符號(hào)文件
默認(rèn)情況下,release 后的 exe 或 dll 都是無(wú)符號(hào)的。沒(méi)有符號(hào),就無(wú)法調(diào)試應(yīng)用程序,很多時(shí)候客戶(hù)機(jī)器上產(chǎn)生了崩潰就無(wú)法確定問(wèn)題原因。這時(shí)候,就需要使用 windows 提供的 pdb 文件來(lái)解決該問(wèn)題。
PDB(Program Database),是微軟開(kāi)發(fā)的用于存儲(chǔ)程序調(diào)試信息的文件格式,在編譯期生成,存儲(chǔ)了源文件名稱(chēng),變量名,函數(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.log0:040> !sym noisy 0:040> .reload /f` 新建
downloads文件夾在 cmd 中執(zhí)行
python3.exe run.py后,等待結(jié)束,符號(hào)文件就下載到downloads中了
-