|
說在前面: 微軟符號服務器地址http://msdl.microsoft.com/download/symbols, 但是你手動在瀏覽器里面輸入是訪問不到的,他只提供給調(diào)試程序進行下載。 還有個辦法,到這里下載Windows 符號程序包:https://msdn.microsoft.com/zh-cn/windows/hardware/gg463028 例如,下載Win7-x64和x86的所有符號,安裝到本地目錄。然后配置Visual Studio,工具-->選項-->符號... 1、方法1: 使用vs進行下載,當然必須是vs2003以后的版本,通過attach到一個進程中或者啟動一個程序進行調(diào)試,然后打開模塊列表窗口,在列表中每一個模塊進行右鍵,即可進行下載符號 方法2: 使用windbg進行下載,同樣是attach或run一個程序,設置一下符號路徑,然后使用 .reload 或者.reload /f /v ntoskrnl.exe (這個試過好像不可以,具體請高手指出原因) 當然也可以強制進行符號加載 使用 ld * 加載當前模塊中所有的模塊符號 或者 ld ntdll (加載指定模塊) 方法3: 采用symchk.exe 來進行加載(優(yōu)點:在不調(diào)用dl的情況就可對dll進行符號加載,防止dll符號文件遺漏加載的問題) symchk /r c:\windows\system32 /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols 這個的意思是對c:\windows\system32下的exe和dll進行遞歸加載符號 目前不太清楚,怎么指定只對特定文件進行單獨加載符號文件,請高手指出 方法4: 自己寫下載符號文件的程序(當然如果你對windows的整個調(diào)試機制比較熟悉,可以采用,但是個人覺得沒那個必要,畢竟微軟提供了工具讓你使用了) 建立 Symbols服務器 建立Symbols Server,最簡單和方便的辦法是使用網(wǎng)絡共享路徑,典型的,我們會在一臺服務器上,依Symbols的類型建立多個路徑: \\symbols_server\ReleaseSymbols \\symbols_server\TempSymbols \\symbols_server\WinSymbols 其中ReleaseSymbols用于保存所有產(chǎn)品正式發(fā)布版本的symbols,這個目錄中的pdb文件是不能刪除的,TempSymbols用于保存非正式版本(例如測試階段)的pdb文件,把它們分開保存,是因為pdb文件比較大,如果磁盤空間不夠,就可以刪除一些TempSymbols中的文件來節(jié)約空間。第三個目錄WinSymbols用于存儲各種windows版本系統(tǒng)本身的symbols。 對于ReleaseSymbols和TempSymbols目錄應該是可控的,即一般設置管理員可寫,其它人只讀,通常由管理員在編譯機編譯完后同時更新其pdb文件。WinSymbols可以設置所有人可讀寫。 設置調(diào)試器Symbols路徑 WinDBG、VC.Net及以上版本都可以通過設置環(huán)境變量指定Symbols路徑,并都能根據(jù)環(huán)境變量設置自動去微軟服務器拉取window系統(tǒng)symbols。右鍵我的電腦—〉“屬性”—〉“高級”—〉“環(huán)境變量”—〉“系統(tǒng)變量”,新建兩個環(huán)境變量: _NT_SYMBOL_PATH=srv*\\symbols_server\WinSymbols*http://msdl.microsoft.com/download/symbols _NT_ALT_SYMBOL_PATH=cache*c:\symbols;\\symbols_server\ReleaseSymbols;\\symbols_server\TempSymbols;\\symbols_server\WinSymbols 這樣設置后,調(diào)試器首先會到_NT_ALT_SYMBOL_PATH指定的共享路徑中去尋找pdb文件,并把找到的文件緩存到c:\symbols目錄下,下次訪問時就不用到共享目錄中查找,這樣可以提高速度。當在_NT_ALT_SYMBOL_PATH中找不到時會查看路徑_NT_SYMBOL_PATH,接著自動從微軟官方網(wǎng)站下載windows系統(tǒng)的pdb文件,并緩存到共享目錄\\symbols_server\WinSymbols中,緩存的好處是當其它人下載相同pdb文件時就直接從共享目錄拉取,不用再跳到微軟網(wǎng)站拉取。 注意設置以上變量后第一次使用Windbg或者VS調(diào)試時,因為要下載windows系統(tǒng)的pdb文件,可能要等待一段時間(Windbg會在命令行窗口右下角顯示“BUSY”狀態(tài),但也有可能不顯示狀態(tài),VS在狀態(tài)欄會顯示Loading symbols for XXX),并且pdb文件都相對比較大,視網(wǎng)速快慢可能要等待十幾分鐘到幾個小時。另外在測試中發(fā)現(xiàn),WinDbg下載symbols的速度比VS快得多。 如果要經(jīng)常使用VC.Net及以上版本,上面的設置會有些問題,因為如果有一些dll沒有symbols,這時VS每次進入調(diào)試狀態(tài)時都會試圖到微軟網(wǎng)站查找相應的pdb文件,導致啟動調(diào)試的速度很慢,因此最好的方法是在windbg的菜單“File”->“Symbol File Path...”填入cache*c:\symbols;\\bobdeng-pc\ReleaseSymbols;\\bobdeng-pc\TempSymbols;\\bobdeng-pc\WinSymbols;srv*\\bobdeng-pc\WinSymbols*http://msdl.microsoft.com/download/symbols 而對VS.Net及以上版本,在“Tools”—〉“Options”—〉“Bebugging”—〉“Symbols”面板中,逐一添加pdb路徑\\bobdeng-pc\ReleaseSymbols、\\bobdeng-pc\TempSymbols和\\bobdeng-pc\WinSymbols,在“Cache symbols from server...”中填入c:\symbols。然后僅僅在需要用VS打開dmp文件定位Crash時才添加Windows系統(tǒng)Symbols路徑:http://msdl.microsoft.com/download/symbols,當調(diào)試完后可以去掉該項選中狀態(tài)使其失效。或者使用symchk工具下載symbols,見后面《附注:手工下載windows symbols的方法》 配置pdb文件編譯輸出目錄 常常一個產(chǎn)品包含許多模塊,為方便pdb管理,可以設置編譯時統(tǒng)一輸出symbol到一個的目錄,例如Debug版本輸出到pdbDebug,Release版本輸出到pdb目錄。在VC6.0下可以通過“工程屬性”-〉“Link”-〉“Project Options”手工修改輸出路徑,VS.Net類似也可以指定輸出目錄。 同步PDB文件到Symbols服務器 pdb文件同步可以使用windbg安裝目錄下的symstore.exe命令行工具,為方便操作,可以在pdb文件輸出目錄建立兩個批處理文件,例如 新建批處理文件UpdateTemp.bat,用于同步該目錄下所有的pdb文件到服務器共享目錄\\symbols_server\TempSymbols,內(nèi)容如下: "C:\Program Files\Debugging Tools for Windows (x86)\symstore.exe" add /r /f "./*.*" /s \\symbols_server\TempSymbols /t "MyProduct" /v "Temp" @PAUSE 類似的,建立另一個批處理文件UpdateRelease.bat,同步pdb文件到服務器共享目錄\\symbols_server\ReleaseSymbols 開發(fā)人員配置編譯生成的本地symbols路徑 并非所有編譯的pdb都同步到symbols服務器上,為方便開發(fā)者自己調(diào)試,還需要配置本機的pdb文件路徑,對于windbg,可以在菜單“File”->“Symbol File Path...”填入編譯時的pdb輸出目錄,多個目錄用;隔開。 使用VS時,在菜單“Tools”—〉“Options”—〉“Bebugging”—〉“Symbols”面板中填入編譯時的pdb輸出目錄。 附注:手工下載windows symbols的方法 如果不想等到調(diào)試時才下載,也可用通過windbg自帶的symchk.exe工具下載windows系統(tǒng)的symbols,或者某個dmp文件所有相關(guān)模塊的symbols,并且通過這個工具下載速度也會更快一些,具體方法如下: 1. 下載dmp文件所有相關(guān)模塊的symbols,緩存到共享路徑,便于其它人快速下載。 "C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" /id c:\MyApplication.dmp /s SRV*\\symbols_server\WinSymbols\*http://msdl.microsoft.com/download/symbols
2. 下載某個已運行進程所有相關(guān)模塊的symbols,緩存到共享路徑,便于其它人快速下載。 "C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" /ie qq.exe /s SRV*\\symbols_server\WinSymbols\*http://msdl.microsoft.com/download/symbols 3. 下載某個exe/dll文件對應的symbols,例如user32.dll,輸入命令行: "C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" c:\windows\system32\user32.dll /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols 4. 下載整個目錄下(例如system32)所有模塊的symbols: "C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" /r c:\windows\system32\ /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols
|