私はどのように重要なデバッグするとき、私は有効なPDBファイルを持っていない強調したいです。通常、PDBファイルはサイレントデバッガによってロードされ、そしてあなたは、モジュールのウィンドウ内のすべてのシンボル解決を見るために喜んでいます。残念ながら、あなたはまた、デバッガが一致するシンボルを見つけることができない状況が発生する場合があります。その理由は、より複雑なシグネチャが同じ自明と一致していないインターネットからに接続または切断されてもよいです。この記事では、私はあなたがシンボルファイルをデバッグする前にチェックする方法を紹介します、とソースファイルを抽出する方法。シンボルファイルを操作するためのさまざまな方法(およびツール)がありますので、私は私が知っているものをご紹介します。
与えられたPEファイルのPDBファイルをダウンロード
すべてのツールPDBファイル形式は、Microsoftの秘密であるので、私が紹介して唯一のAPIのラッパーです。PDBファイル、それらを得るために、私たち最初の必要性に対処するため。助けることができる私たちは当社のツールをリストアップしてみましょう。
symchk.exe
符号チェッカー(Symchk.exe)は、それが一致するシンボルが利用可能であることを確認するためにシンボルの実行可能ファイルと比較され、アプリケーションです。Symchkキャッシュフィル記号を使用することもできます。これは、ファイルおよびプロセスシンボル情報は、PEファイル(EXE、DLL)から読み出されるダンプすることができます。また、再帰的なディレクトリ検索やバッチファイルをサポートしています。
私たちは、kernel32.dllのロードされたシンボルライブラリを開始します。
c:\Windows\System32>echo %_NT_SYMBOL_PATH%
SRV*C:\Symbols\MSS*http://referencesource.microsoft.com/symbols;SRV*C:\Symbols\MSS*http://msdl.microsoft.com/download/symbols
c:\Windows\System32>symchk /v /os kernel32.dll
[SYMCHK] Searching for symbols to c:\Windows\System32\kernel32.dll in path SRV*C:\Symbols\MSS*http://referencesource.microsoft.com/symbols;SRV*C:\Symbols\MSS*http://msdl.microsoft.com/download/symbols
DBGHELP: Symbol Search Path: SRV*C:\Symbols\MSS*http://referencesource.microsoft.com/symbols;SRV*C:\Symbols\MSS*http://msdl.microsoft.com/download/symbols
[SYMCHK] Using search path "SRV*C:\Symbols\MSS*http://referencesource.microsoft.com/symbols;SRV*C:\Symbols\MSS*http://msdl.microsoft.com/download/symbols"
DBGHELP: No header for c:\Windows\System32\kernel32.dll. Searching for image on disk
DBGHELP: c:\Windows\System32\kernel32.dll - OK
SYMSRV: C:\Symbols\MSS\kernel32.pdb\9B30FD7CD6B44975BF34B43B6EF668212\kernel32.pdb not found
SYMSRV: http://referencesource.microsoft.com/symbols/kernel32.pdb/9B30FD7CD6B44975BF34B43B6EF668212/kernel32.pdb not found
SYMSRV: kernel32.pdb from http://msdl.microsoft.com/download/symbols: 704453 bytes - copied
DBGHELP: kernel32 - public symbols
C:\Symbols\MSS\kernel32.pdb\9B30FD7CD6B44975BF34B43B6EF668212\kernel32.pdb
[SYMCHK] MODULE64 Info ----------------------
[SYMCHK] Struct size: 1680 bytes
[SYMCHK] Base: 0x0000000078D20000
[SYMCHK] Image size: 1175552 bytes
[SYMCHK] Date: 0x4e21213b
[SYMCHK] Checksum: 0x0012386d
[SYMCHK] NumSyms: 0
[SYMCHK] SymType: SymPDB
[SYMCHK] ModName: kernel32
[SYMCHK] ImageName: c:\Windows\System32\kernel32.dll
[SYMCHK] LoadedImage: c:\Windows\System32\kernel32.dll
[SYMCHK] PDB: "C:\Symbols\MSS\kernel32.pdb\9B30FD7CD6B44975BF34B43B6EF668212\kernel32.pdb"
[SYMCHK] CV: RSDS
[SYMCHK] CV DWORD: 0x53445352
[SYMCHK] CV Data: kernel32.pdb
[SYMCHK] PDB Sig: 0
[SYMCHK] PDB7 Sig: {9B30FD7C-D6B4-4975-BF34-B43B6EF66821}
[SYMCHK] Age: 2
[SYMCHK] PDB Matched: TRUE
[SYMCHK] DBG Matched: TRUE
[SYMCHK] Line nubmers: FALSE
[SYMCHK] Global syms: FALSE
[SYMCHK] Type Info: FALSE
[SYMCHK] ------------------------------------
SymbolCheckVersion 0x00000002
Result 0x00030001
DbgFilename
DbgTimeDateStamp 0x4e21213b
DbgSizeOfImage 0x0011f000
DbgChecksum 0x0012386d
PdbFilename C:\Symbols\MSS\kernel32.pdb\9B30FD7CD6B44975BF34B43B6EF668212\kernel32.pdb
PdbSignature {9B30FD7C-D6B4-4975-BF34-B43B6EF66821}
PdbDbiAge 0x00000002
[SYMCHK] [ 0x00000000 - 0x00030001 ] Checked "c:\Windows\System32\kernel32.dll"
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
あなたが見モード(/ vスイッチ)VERBOSE、あなたがやっているsymchkかについて多くの情報を受信すると。私たちも、それが使用するシンボルAPI(dbghelpメッセージ)を読み取ることができます。/ Oは完了通知symchkプリントアウトPathメッセージのシンボルファイルを切り替えます。このコマンドを実行した後、kernel32.pdbファイルは、シンボルストアにする必要があります。あなたがインデックスに全体System32ディレクトリをしたい場合は、/ rスイッチを使用する必要があり、それ知らせるsymchk再帰的にトラバースディレクトリに提供し、すべてのファイル、例えば見つかりシンボルをダウンロードしてください。symchk /r /v c:\windows\system32\*.dll
プロセスnotepad.exeを負荷シンボルへレッツ・トライ:
c:\temp\symtest>tasklist /FI "IMAGENAME eq notepad.exe"
Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
notepad.exe 2264 Console 1 6 036 K
c:\temp\symtest>symchk /ip 2264 /s SRV*.*http://msdl.microsoft.com/download/symbols
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 26
使用/ IPスイッチは、我々はすべてのモジュールは、プロセスsymchkダウンロードシンボルファイルにロードされる、唯一のプロセスIDを提供することができます。この例では、我々はそれが使用されるシンボルはSymchkある(設定されている場合、カバレッジ_NT_SYMBOL_PATHのsymchk)を提供しなければならないパス/ sスイッチを使用します。この例では、カレントディレクトリにマイクロソフトのパブリックシンボルサーバーからのダウンロードを提出します。次のようにこのコマンドを実行した後、ディレクトリリストは以下のとおりです。
c:\temp\symtest>tree .
Folder PATH listing
Volume serial number is 00000002 C622:C13F
C:\TEMP\SYMTEST
├───advapi32.pdb
│ └───6AEFDCFF7F2A429B8532CD2BFDDF85D12
├───CLBCatQ.pdb
│ └───60B9D310C472440BA13F66BFF0FC39E32
├───comctl32.pdb
│ └───943BA638A2CD4D88A1C7E7418EAF796C1
├───comdlg32.pdb
│ └───631B57376F8549FDB2E7A8AB3D2D1FDF2
├───cryptbase.pdb
│ └───F03E074BB9E74C9F9BBFB0E42EF3A0AB2
├───dwmapi.pdb
│ └───8683ED0C3DBE4053883EC22FD9B4F2102
├───gdi32.pdb
│ └───FB9403C3B1304DA192C4D0E3485E25ED2
├───imm32.pdb
│ └───98F27BA5AEE541ECBEE00CD03AD50FEE2
├───kernel32.pdb
│ └───9B30FD7CD6B44975BF34B43B6EF668212
├───kernelbase.pdb
│ └───61044362232B410AA600843CEBFD11612
...
もう一つの興味深いスイッチは、ダンプファイルをデバッグすることができますされ、(/ ID)です。もう一つの大きな特徴は、symchk.exeマニフェストファイルと呼ばれるものです。マニフェストファイルがダウンロードされなければならない全てのシンボルに関する情報が含まれています。次いで、使用/ Symchk操作スイッチをOM、スイッチは、任意のシンボルをダウンロードせずに、マニフェストファイルを生成します。その後、インターネットに接続されている任意のコンピュータにファイルのリストをコピー、および/ IMスイッチのダウンロードのシンボルファイルを使用することができます。次のコードは、使用の例を示す図です。
c:\temp\symtest>symchk /om notepad-symbols.man /ip 2264
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 26
c:\temp\symtest>type notepad-symbols.man
notepad.pdb,36CFD5F9888C4483B522B9DB242D84782,1
notepad.exe,4a5bc9b335000,1
ntdll.pdb,6192BFDB9F04442995FFCB0BE95172E12,1
ntdll.dll,4ce7c8f91a9000,1
kernel32.pdb,9B30FD7CD6B44975BF34B43B6EF668212,1
kernel32.dll,4e21213b11f000,1
kernelbase.pdb,61044362232B410AA600843CEBFD11612,1
KernelBase.dll,4e21213c6c000,1
...
c:\temp\symtest>symchk /im notepad-symbols.man /s SRV*.*http://msdl.microsoft.com/download/symbols
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 52
dbh.exe
このツールは、それはほとんどすべての機能を明らかにし、DbgHelp.dllラッパーライブラリです。あなたがデバッグツールは、Windowsのヘルプをより深く理解をしたいので、もし私たちは、使用例を見ていきます。パラメータとしてモジュール名がdbh.exeを実行すると、自動的にシンボルファイルをダウンロードします。したがって、限りコールDBH cとして:\ WINDOWS \ SYSTEM32 \ kernel32.dllの情報、ファイルおよびPEファイル(KERNEL32.DLL)の程度シンボルファイル(使用_NT_SYMBOL_PATH環境変数)、および印刷情報をダウンロードすることができます。
c:\temp>dbh c:\windows\system32\kernel32.dll info
SizeOfStruct : 0x690
BaseOfImage : 0x1677721664x
ImageSize : 0x1000000
TimeDateStamp : 0x4e21213b
CheckSum : 0x12386d
NumSyms : 0x0
SymType : SymPdb
ModuleName : kernel32
ImageName : c:\windows\system32\kernel32.dll
LoadedImageName : c:\windows\system32\kernel32.dll
LoadedPdbName : C:\Symbols\MSS\kernel32.pdb\9B30FD7CD6B44975BF34B43B6EF668212\kernel32.pdb
CVSig : 0x53445352
CVData : kernel32.pdb
PdbSig : 0x0
PdbSig70 : 0x9b30fd7c, 0xd6b4, 0x4975, 0xbf, 0x34, 0xb4, 0x3b, 0x6e, 0xf6, 0x68, 0x21
PdbAge : 0x2
PdbUnmatched : false
DbgUnmatched : false
LineNumbers : false
GlobalSymbols : false
TypeInfo : false
SourceIndexed : false
PublicSymbols : true
MachineType : X64
あなたはPDBファイルのロードについての詳細を確認したい場合は、-nスイッチを使用します。デフォルトのシンボルパス(パス設定記号またはカバー)を変更するには、使用が-s:スイッチ。
DUMPBIN.EXE
あなたはここに表示され、このツールで驚かれるかもしれませんが、あなたはそれ/ PDBPATH気づけば[:VERBOSE]スイッチを?kernel32.dllのライブラリ/ pdbpathで発行DUMPBIN:冗長パブリックシンボルPDBファイルからダウンロードストアにつながります。
c:\temp\symtest>dumpbin /pdbpath:verbose c:\windows\system32\kernel32.dll
Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file c:\windows\system32\kernel32.dll
File Type: DLL
PDB file 'c:\windows\system32\kernel32.pdb' checked. (File not found)
PDB file 'c:\temp\symtest\kernel32.pdb' checked. (File not found)
PDB file found at 'C:\Symbols\MSS\kernel32.pdb\9B30FD7CD6B44975BF34B43B6EF668212\kernel32.pdb'
Summary
2000 .data
A000 .pdata
6E000 .rdata
8000 .reloc
1000 .rsrc
9B000 .text
ソースサーバからソースコードをダウンロードしてください
srctool.exe
それはあなたがソースファイルPDBファイルインデックスをチェックし、最終的にそれらを抽出することができますので、このツールは非常に興味深いです。-rスイッチを使用して、あなたは、ソースコードがハードコーディングされたパスがあるPDBファイルを確認することができます
c:\temp>srctool -r ConsoleApplication1.pdb
D:\lab\symbols-lab\symbols\ConsoleApplication1\Program.cs
D:\lab\symbols-lab\symbols\ConsoleApplication1\AdvertQuickView.cs
任意のスイッチ、SRCooTストリーム・ソース・サーバーをチェックせずにPDBファイル(存在する場合)と、例えば、ソースファイルを印刷するために取り出された命令を実行します。
c:\temp>srctool ConsoleApplication1.pdb
[D:\lab\symbols-lab\symbols\ConsoleApplication1\Program.cs] cmd: cmd /c svn.exe cat "svn://localhost/test2/Program.cs@1" --non-interactive --username admin --password admin > "
[D:\lab\symbols-lab\symbols\ConsoleApplication1\AdvertQuickView.cs] cmd: cmd /c svn.exe cat "svn://localhost/test2/AdvertQuickView.cs@1" --non-interactive --username admin --password admin > "
ConsoleApplication1.pdb: 2 source files are indexed
コマンドを実行して、ソースファイルを抽出するには、単にコールの上部に-xスイッチを追加します。また、スイッチは、(デフォルトはカレントディレクトリ)のディレクトリを抽出するために、ソースファイル-d指定を使用することができます。
pdbstr
あなたはフローソースサーバーをより細かく制御したい場合pdbstrコマンドを確認することができます。これを使うと、ソースサーバのPDBファイルの情報を読み込み、更新することができます。ストリームソースサーバは、実際との事前定義されたテキストセクション(詳細はここで見つけることができる)のブロックです。次を発行して、その内容をダンプすることができます。
c:\temp>pdbstr -r -p:ConsoleApplication1.pdb -s:srcsrv > stream.txt
stream.txtファイルには、次が含まれている必要があります。
SRCSRV: ini ------------------------------------------------
VERSION=1
INDEXVERSION=2
VERCTRL=Subversion
DATETIME=Thu Nov 17 13:31:46 2011
SRCSRV: variables ------------------------------------------
SVNUSER=admin
SVNPASS=admin
SVN_EXTRACT_TARGET=%targ%\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%)
SVN_EXTRACT_CMD=cmd /c svn.exe cat "%var2%%var3%@%var4%" --non-interactive --username %svnuser% --password %svnpass% > "
%svn_extract_target%"
SRCSRVTRG=%SVN_extract_target%
SRCSRVCMD=%SVN_extract_cmd%
SRCSRV: source files ---------------------------------------
D:\lab\symbols-lab\symbols\ConsoleApplication1\Program.cs*svn://localhost/*test2/Program.cs*1
D:\lab\symbols-lab\symbols\ConsoleApplication1\AdvertQuickView.cs*svn://localhost/*test2/AdvertQuickView.cs*1
SRCSRV: end ------------------------------------------------
c:\temp>pdbstr -w -p:ConsoleApplication1.pdb -s:srcsrv -i:stream.txt
Pdbstrはあなたのためのソースコードファイルを抽出しませんが、彼らがどこにあるソースコンテンツからの抽出物に、あなたは簡単に見つけることができます。これは、ツールPDBの私たちのリストを終了します - 私はあなたがそれが役に立つことを願っています。