Share via


使用 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

另請參閱

SymChk Command-Line 選項

使用符號伺服器和符號存放區