デバッガのうちPDBファイル

私はどのように重要なデバッグするとき、私は有効な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%
 
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:  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 ------------------------------------------------
その後、必要な変更を適用し、PDBファイルをバックアップの起源の新しい定義を保存することができます:
c:\temp>pdbstr -w -p:ConsoleApplication1.pdb -s:srcsrv -i:stream.txt

Pdbstrはあなたのためのソースコードファイルを抽出しませんが、彼らがどこにあるソースコンテンツからの抽出物に、あなたは簡単に見つけることができます。これは、ツールPDBの私たちのリストを終了します - 私はあなたがそれが役に立つことを願っています。

おすすめ

転載: www.cnblogs.com/yilang/p/12038509.html