Windbg 無(wú)法下載 pdb 的解決方法

符號(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ú)法下載。

解決方案

  1. 配置代理

    該方案需要配置 http/https 代理。據(jù)悉,socket5 代理無(wú)法下載符號(hào)文件。因?yàn)楣P者這邊需要下載符號(hào)文件提供給其他人使用,因此,筆者采用的是 python 代碼下載。

  2. 使用 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 中了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容