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