在VS中調(diào)試程序的時(shí)候,不可避免會遇到系統(tǒng)DLL文件的調(diào)用,比如Ntdll.dll、kernel32.dll等,但是這些系統(tǒng)文件在本地是沒有調(diào)試信息的,所以在call stack window中經(jīng)常會看類似 ntdll.dll!7c92e01b()的條目,我們知道這是一個(gè)函數(shù),但看不出函數(shù)的名稱。只能看出這個(gè)函數(shù)所在的DLL文件的名稱,以及該函數(shù)在dll文件中的位置,此時(shí)可以設(shè)置VS的選項(xiàng)Load DLL Exports,從而可以獲得DLL文件導(dǎo)出的文件的名稱。ntdll.dll!7c92e01b()將被顯示為ntdll.dll!NtQueryInformationProcess(),我們得到了函數(shù)名稱。但是這只能到DLL文件的導(dǎo)出函數(shù)一級,對于DLL中的非導(dǎo)出函數(shù)VS仍然不能獲得函數(shù)名,因?yàn)镈LL導(dǎo)出表中沒有DLL內(nèi)部函數(shù)的調(diào)試信息。關(guān)于Load DLL Exports的說明參考附錄A。
Microsoft提供了Symbol Server用于解決這類的問題,在該服務(wù)器上提供了Windows和.Net等各類Microsoft的產(chǎn)品的Symbol,也就是pdb文件,有了這些文件,我們就能很容易地定位code了,也能看到系統(tǒng)dll文件內(nèi)部的函數(shù)的名稱了。
在《How to use a symbol server with the Visual Studio .NET debugger》http://support.microsoft.com/default.aspx?scid=kb;en-us;319037
和《使用 Microsoft Symbol Server 獲取調(diào)試符號文件》http://support.microsoft.com/kb/311503/這兩篇文章中介紹了symbol server的使用方法。
總結(jié)一下:
1. Microsoft使用了 Symbol Server 技術(shù)。Microsoft Symbol Server 是使用 Debugging Tools for Windows 軟件包附帶的 SymSrv 技術(shù) (SymSrv.dll) 構(gòu)建的。SymSrv 會生成本地符號高速緩存,以進(jìn)行快速、自動的符號解析。在支持該技術(shù)的IDE的執(zhí)行目錄下可以找到SymSrv.dll文件,比如在C:\Program Files\Microsoft Visual Studio 8\Common7\IDE目錄下就存在SymSrv.dll文件。如果啟用了Symbol Server 技術(shù)。則在調(diào)試的過程中SymSrv將會根據(jù)當(dāng)前加載的DLL自動從微軟的服務(wù)器上下載對應(yīng)的Symbol文件,并保存到本地指定的目錄中,以備調(diào)試使用。
2. 在IDE中啟用Symbol Server技術(shù)。啟用的過程就是指定Symbol文件路徑的過程。在VS.NET2003中有三種設(shè)置的方法:
(1)、通過在系統(tǒng)中添加_NT_SYMBOL_PATH環(huán)境變量的方式設(shè)置Symbol全局可用。
如果在 _NT_SYMBOL_PATH 環(huán)境變量中提供了正確的 symsrv 語法,常見的 Microsoft 調(diào)試工具就會使用 SymSrv 技術(shù)。這些工具會自動包括您在該變量中提供為符號路徑的任何內(nèi)容。例如:
Set _NT_SYMBOL_PATH = symsrv*symsrv.dll*f:\localsymbols*http://msdl.microsoft.com/download/symbols
(2)、只供某個(gè)解決方案使用。在解決方案的屬性?“Common Properties”?“Debug Symbol Files”中添加一個(gè)新的Symbol File的路徑,比如:symsrv*symsrv.dll*f:\localsymbols*http://msdl.microsoft.com/download/symbols。
(3)只供某個(gè)工程使用。在工程的屬性頁?“Debugging”?“Symbol Path”一欄中添加Symbol File文件的路徑,比如symsrv*symsrv.dll*f:\localsymbols*http://msdl.microsoft.com/download/symbols。
在VS2005中的設(shè)置方法不同:在2005中是通過“工具”?“選項(xiàng)”?“調(diào)試”?“符號”來設(shè)置Symbol File的路徑的。參考附錄B。
3. 啟動Symbol Server之后,第一次調(diào)試的時(shí)候,IDE將要從Server上下載調(diào)試信息,所以第一次調(diào)試的時(shí)候速度將會比較慢。為此微軟提供了一個(gè)工具SymChk.exe用于下載Symbol文件到本地機(jī)器。SymChk.exe的使用方法參考附錄D。
附錄A:MSDN中關(guān)于Load DLL Exports的說明
若要訪問“本機(jī)”頁,請單擊“工具”菜單并選擇“選項(xiàng)”。在“選項(xiàng)”對話框中,展開“調(diào)試”節(jié)點(diǎn)并選擇“本機(jī)”。該頁允許為調(diào)試本機(jī)應(yīng)用程序設(shè)置下列選項(xiàng)。
加載 DLL 導(dǎo)出
選定后,加載 DLL 導(dǎo)出表。處理 Windows 98 系統(tǒng) DLL、Windows 消息、Windows 過程 (WindowProc)、COM 對象、封送或任何您不具有其符號的 DLL 時(shí),DLL 導(dǎo)出表中的符號信息很有用。讀取 DLL 導(dǎo)出信息需要一些開銷,因此該功能默認(rèn)情況下是關(guān)閉的。
若要查看 DLL 導(dǎo)出表中的可用符號,請使用 dumpbin /exports。符號可用于任何 32 位系統(tǒng) DLL。通過閱讀 dumpbin /exports 輸出,可以查看到精確的函數(shù)名,包括非字母數(shù)字字符。這對于在函數(shù)上設(shè)置斷點(diǎn)很有用。DLL 導(dǎo)出表中的函數(shù)名在調(diào)試器的其他位置可能似乎被截?cái)嗔?。調(diào)用將按調(diào)用順序列出,當(dāng)前函數(shù)(嵌套最深的函數(shù))位于頂部。有關(guān)更多信息,請參見 dumpbin /exports。
附錄B:VS2005 MSDN中《如何:指定一個(gè)符號路徑》
為調(diào)試代碼,調(diào)試器需要包含應(yīng)用程序的符號的 PDB 文件(或舊格式的 DBG 文件)。默認(rèn)情況下,調(diào)試器在與 EXE 或應(yīng)用程序相同的位置查找這些文件。
如果需要調(diào)試系統(tǒng)或第三方 DLL,則還必須通知調(diào)試器這些 DLL 的 PDB 或 DBG 文件的所在位置,所以必須指定這些 DBG 或 PDB 文件的所在路徑以便調(diào)試器可以找到它們。
向符號文件(.pdb 或 .dbg)位置列表添加路徑名
1. 從“工具”菜單中選擇“選項(xiàng)”。
2. 在“選項(xiàng)”對話框中,單擊“調(diào)試”節(jié)點(diǎn)將其打開。
3. 在“調(diào)試”下,選擇“符號”類別。
4. 在“符號”頁上有一個(gè)顯示“符號文件 (.pdb) 位置”的框。該框上方有四個(gè)圖標(biāo)。單擊文件夾圖標(biāo),可編輯文本即出現(xiàn)在“符號文件 (.pdb) 位置”框中。
5. 編輯文本以添加新的路徑名。語句完成功能有助于獲得正確的格式。
6. 確保“只在手動加載符號時(shí)搜索上述位置”未被選中,除非在調(diào)試時(shí)要手動加載符號。
7. 如果要使用遠(yuǎn)程符號服務(wù)器上的符號,通過指定一個(gè)可將符號復(fù)制到其中的本地目錄,您將能夠提高性能。為此,請使用“將符號從符號服務(wù)器緩存到此目錄”框。注意,如果正在調(diào)試遠(yuǎn)程計(jì)算機(jī)上的程序,則緩存目錄是指遠(yuǎn)程計(jì)算機(jī)上的目錄。
8. 單擊“確定”。
附錄C:VS2005 MSDN中《如何:使用符號服務(wù)器》
可以使用符號服務(wù)器以允許 Visual Studio 自動下載用于調(diào)試 Visual Studio 項(xiàng)目的正確符號。
Microsoft 為開發(fā)人員維護(hù)了一臺公共符號服務(wù)器,地址是 http://msdl.microsoft.com/download/symbols。此服務(wù)器僅用于符號下載。它是不可瀏覽的。此服務(wù)器為各種操作系統(tǒng)(如 Windows NT 4.0、Windows 2000、Windows XP 和 Windows Server 2003)以及 MDAC、IIS、ISA 和 .NET Framework 提供符號。
另外,您也可以將本地符號服務(wù)器安裝在 Intranet 上或本地計(jì)算機(jī)上。
若要使用符號服務(wù)器,請按照下面的過程的描述,在 Visual Studio 選項(xiàng)中指定服務(wù)器的路徑。
可以從“選項(xiàng)”對話框中的“符號文件 (.pdb) 位置”列表中移除路徑。
設(shè)置符號服務(wù)器的路徑
1. 在“調(diào)試”菜單上,單擊“選項(xiàng)”。
2. 在“選項(xiàng)”對話框中打開“調(diào)試”節(jié)點(diǎn),然后單擊“符號”。
3. 編輯文本以添加符號服務(wù)器的新路徑。
若要使用 Microsoft 公共符號服務(wù)器,請輸入: http://msdl.microsoft.com/download/symbols
若要使用 Intranet 符號服務(wù)器,請輸入:\\server\path\symbols
若要使用本地計(jì)算機(jī)上的符號服務(wù)器,請輸入:c:\path\symbols
4. 確保“只在手動加載符號時(shí)搜索上述位置”未被選中,除非在調(diào)試時(shí)要手動加載符號。
5. 如果使用遠(yuǎn)程符號服務(wù)器上的符號,通過指定符號能夠復(fù)制到的本地目錄可以提高性能。若要執(zhí)行此操作,請?jiān)?#8220;將來自符號服務(wù)器的符號緩存至此目錄”框中輸入一個(gè)路徑。若要連接至 Microsoft 公共符號服務(wù)器,您需要啟用此設(shè)置。注意,如果在遠(yuǎn)程計(jì)算機(jī)上調(diào)試程序,緩存目錄指的是遠(yuǎn)程計(jì)算機(jī)上的目錄。
6. 單擊“確定”。
7. 如果使用的是 Microsoft 公共符號服務(wù)器,則會出現(xiàn)“最終用戶許可協(xié)議”對話框。單擊“是”可接受該協(xié)議并將符號下載至本地緩存。
附錄D:使用 SymChk.exe 實(shí)用工具下載符號
您可以使用 SymChk.exe 實(shí)用工具,驗(yàn)證符號并以便捷、非侵入的方式生成本地符號高速緩存。SymChk.exe 實(shí)用程序隨 Debugging Tools for Windows 軟件包提供。SymChk.exe 是一種命令行工具。您可能需要將 Debugging Tools for Windows 軟件包的文件夾添加到系統(tǒng)上的 PATH 環(huán)境變量,以便從任意命令提示符下訪問該工具。
要使用 SymChk.exe 實(shí)用程序下載 Windows\System32 文件夾中所有組件的符號文件,請使用以下命令行命令:
symchk /r c:\windows\system32 /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols
在此示例中:
• “/r c:\windows\system32”查找 System32 文件夾和所有子文件夾中的所有符號文件。
• “/s SRV*c:*http://msdl.microsoft.com/download/symbols”指定用于符號解析的符號路徑。在此例中,“c:\symbols”是將在其中從符號服務(wù)器復(fù)制符號的本地文件夾。
要獲取 SymChk.exe 命令行選項(xiàng)的更多信息,請?jiān)诿钐崾痉骆I入 symchk /?。其他選項(xiàng)包括指定正在運(yùn)行的可執(zhí)行文件的名稱或進(jìn)程 ID (PID) 的功能。