PDB는 디버거의 출력 파일

나는 얼마나 중요한 디버깅 할 때 내가 올바른 PDB 파일이없는 강조하고 싶다. 일반적으로, PDB 파일은 침묵 디버거에 의해로드됩니다, 당신은 모듈 창에있는 모든 심볼 해석을 볼 수 기쁘게 생각합니다. 불행하게도, 당신은 또한 심볼과 일치하는 심볼을 찾을 수 없습니다 디버거 상황이 발생할 수 있습니다. 그 이유는 연결 또는 더 복잡한 서명이 같은 사소한 일치하지 않는 인터넷 연결이 끊어 질 수 있습니다. 이 기사에서는 당신이 기호 파일을 디버깅하기 전에 확인하는 방법과 소스 파일을 추출하는 방법을 보여줍니다. 기호 파일을 운영하는 다른 방법 (및 도구)이 있기 때문에, 내가 아는 사람들을 소개합니다.

주어진 PE 파일 PDB 파일을 다운로드

소개 난 단지 API 래퍼 그래서 모든 때문에 도구 PDB 파일 형식은 마이크로 소프트의 비밀입니다. 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 스위치) 자세한, 당신은 일을 symchk에 대한 정보를 많이받을 수있다. 우리는 심지어이 사용하는 기호 API (dbghelp 메시지)를 읽을 수 있습니다. / O를 완료 통지 symchk 출력 경로 메시지 기호 파일을 전환합니다. 이 명령을 실행 한 후, kernel32.pdb 파일은 기호 저장소에 있어야합니다. 당신이 인덱스에 전체 System32 디렉터리를 원하는 경우에, 당신은 정보 용은 예를 들어, 제공 반복적으로 트래버스 디렉토리를 symchk 모든 파일을 발견 기호를 다운로드합니다 / r에 스위치를 사용해야합니다.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
...

또 다른 흥미로운 스위치는 덤프 파일을 디버그 할 수 있습니다 (/ 아이디)입니다. 또 다른 큰 특징은 매니페스트 파일 symchk.exe라고 무언가이다. 매니페스트 파일을 다운로드해야합니다 모든 기호에 대한 정보가 포함되어 있습니다. 그런 다음, 사용 /를 Symchk 작동 스위치를 옴, 스위치는 기호를 다운로드하지 않고, 매니페스트 파일을 생성합니다. 그런 다음 인터넷에 연결된 모든 컴퓨터에 파일 목록을 복사하고 / 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