SymChk の使用
SymChk の基本構文は次のとおりです。
symchk [/r] FileNames /s SymbolPath
FileNames は、シンボルが必要な 1 つ以上のプログラム ファイルを指定します。 FileNames がディレクトリで、/r フラグが使用されている場合、このディレクトリは再帰的に調べられ、SymChk はこのディレクトリ ツリー内のすべてのプログラム ファイルのシンボルを見つけようとします。 SymbolPath は、SymChk がシンボルを検索する場所を指定します。
他にも多くのコマンド ライン オプションがあります。 完全な一覧については、「SymChk コマンド ライン オプション」を参照してください。
symchk の取得
Symchk は、他のデバッグ ツールと同様に、デバッガーの一部として提供されます。 詳細については、「 Windows 用デバッグ ツールのダウンロードとインストール」を参照してください。
デバッグ ツールがインストールされると、64 ビット Windows 用のこのディレクトリで symchk が利用できるようになります。
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 を 1 回実行し、シンボル ファイルが見つかれば、それらのファイルはダウンストリーム ストアにコピーされます。 しかし、これらのファイルがシンボル ストアで変更または削除された後に、SymChk を再び実行しても、SymChk はこの事実を認識しません。ダウンストリーム ストアで必要なファイルを見つけると、それ以上先は検索しないためです。
注 SymChk は常に SymSrv (Symsrv.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 ではシンボルを見つけられなかったファイルのみが一覧表示されます。 したがって、この例ではどのファイルも一覧表示されませんでした。 「passed」(成功) カテゴリに 1 つのファイルが一覧表示され、「failed」(失敗) カテゴリにはファイルが 1 つもないため、検索が成功したことがわかります。
プログラム ファイルは、実行可能なコードを含んでいなければ無視されます。 多くのリソース ファイルはこのタイプです。
すべてのプログラム ファイルのファイル名を確認する場合は、/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