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