使用 SymChk
SymChk 的基本語法如下:
symchk [/r] FileNames /s SymbolPath
FileNames 會指定一或多個需要符號的程式檔案。 如果 FileNames 是目錄,且使用 /r 旗標,則會以遞迴方式探索此目錄,而 SymChk 會嘗試尋找此目錄樹狀目錄中所有程式檔的符號。 SymbolPath 會指定 SymChk 要搜尋符號的位置。
還有更多命令列選項。 如需完整清單,請參閱 SymChk Command-Line Options。
取得符號
符號,就像其他偵錯工具一樣,隨附于偵錯工具。 如需詳細資訊,請參閱< Windows 偵錯工具>。
安裝偵錯工具之後,符號就會在此目錄中提供 64 位 Windows。
C:\Program Files (x86) \Windows Kits\10\Debuggers\x64
使用方式範例
指定的符號路徑可以包含任意數目的本機目錄、UNC 目錄或符號伺服器。 本機目錄和 UNC 目錄不會以遞迴方式搜尋。 只會根據可執行檔的延伸模組搜尋指定的目錄和子目錄。 例如,查詢
symchk thisdriver.sys /s G:\symbols
將會搜尋 G:\mysymbols 和 G:\mysymbols\sys。
您可以使用下列任一語法作為符號路徑的一部分來指定符號伺服器:
srv*DownstreamStore*\\Server\Share
srv*\\Server\Share
這與在偵錯工具的符號路徑中使用符號伺服器非常類似。 如需詳細資訊,請參閱 使用符號伺服器和符號存放區。
如果指定下游存放區,SymChk 將會複製符號伺服器找到的所有有效符號檔,並將其放在下游存放區中。 只有完整相符專案的符號檔會複製到下游。
SymChk 一律會在查詢符號伺服器之前,先搜尋下游存放區。 因此,當其他人維護符號存放區時,您應該小心使用下游存放區。 如果您執行 SymChk 一次,它會尋找符號檔,它會將這些檔案複製到下游存放區。 如果您接著在符號存放區上改變或刪除這些檔案之後再次執行 SymChk,SymChk 就不會注意到這個事實,因為它會發現它在下游存放區上尋找的內容,而且不會再看一下。
注意 SymChk 一律使用 SymSrv (Symsrv.dll) 做為其符號伺服器 DLL。 另一方面,如果有符號伺服器 DLL,偵錯工具可以選擇 SymSrv 以外的符號伺服器 DLL。 (SymSrv 是 Windows 套件偵錯工具中包含的符號伺服器。)
使用 SymChk 來判斷符號是否為私用或公用
若要判斷符號檔是否為私用或公用,請使用 /v 參數,讓 SymChk 顯示詳細資訊輸出。 假設 MyApp.exe 和 MyApp.pdb 位於 c:\sym 資料夾中。 輸入此命令。
symchk /v C:\sym\MyApp.exe /s C:\sym**
如果 MyApp.pdb 包含私人符號,SymChk 的輸出看起來像這樣。
[SYMCHK] Searching for symbols to c:\sym\MyApp.exe in path c:\sym
...
DBGHELP: MyApp - private symbols & lines
c:\sym\MyApp.pdb
...
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
如果 MyApp.pdb 只包含公用符號,SymChk 的輸出看起來會像這樣。
[SYMCHK] Searching for symbols to c:\sym\MyApp.exe in path c:\sym
...
DBGHELP: MyApp - public symbols
c:\sym\MyApp.pdb
...
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
若要限制搜尋,使其只尋找公用符號檔,請使用 s 選項搭配 / s 參數 (/ss) 。 如果 MyApp.pdb 只包含公用符號,下列命令會尋找相符專案。 如果 MyApp.pdb 包含私人符號,則找不到相符專案。
symchk /v C:\sym\MyApp.exe /s C:\sym
如需詳細資訊,請參閱 公用和私人符號。
範例
以下是一些範例。 下列命令會搜尋程式 Myapp.exe 的符號:
E:\debuggers> symchk F:\myapp.exe /s F:\symbols\applications
SYMCHK: Myapp.exe FAILED - Myapp.pdb is missing
SYMCHK: FAILED files = 1
SYMCHK: PASSED + IGNORED files = 0
您可以使用不同的符號路徑再試一次:
E:\debuggers> symchk F:\myapp.exe /s F:\symbols\newdirectory
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
這次搜尋成功。 如果未使用詳細資訊選項,SymChk 只會列出找不到符號的檔案。 因此在此範例中,未列出任何檔案。 您可以告訴搜尋成功,因為現在有一個檔案列在「已傳遞」類別中,而且「失敗」類別中沒有列出。
如果未包含可執行程式碼,則會忽略程式檔。 許多資源檔屬於此類型。
如果您想要查看所有程式檔的檔案名,您可以使用 /v 選項來產生詳細資訊輸出:
E:\debuggers> symchk /v F:\myapp.exe /s F:\symbols\newdirectory
SYMCHK: MyApp.exe PASSED
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
下列命令會在符號伺服器中搜尋大量的 Windows 符號。 有各種不同的可能錯誤訊息:
E:\debuggers> symchk /r C:\windows\system32 /s srv*\\manysymbols\windows
SYMCHK: msisam11.dll FAILED - MSISAM11.pdb is missing
SYMCHK: msuni11.dll FAILED - msuni11link.pdb is missing
SYMCHK: msdxm.ocx FAILED - Image is split correctly, but msdxm.dbg i
s missing
SYMCHK: expsrv.dll FAILED - Checksum doesn't match with expsrv.DBG
SYMCHK: imeshare.dll FAILED - imeshare.opt.pdb is missing
SYMCHK: ir32_32.dll FAILED - Built with no debugging information
SYMCHK: author.dll FAILED - rpctest.pdb is missing
SYMCHK: msvcrt40.dll FAILED - Built with no debugging information
......
SYMCHK: FAILED files = 211
SYMCHK: PASSED + IGNORED files = 4809