프로그램 데이터베이스
Program database![]() |
파일 이름 확장자 | .pdb |
---|---|
인터넷 미디어 유형 | 응용 프로그램/옥텟 스트림 |
개발자 | 마이크로소프트 |
포맷의 종류 | 디버깅 |
프로그램 데이터베이스(PDB)는 프로그램(또는 일반적으로 DLL이나 EXE 등의 프로그램 모듈)에 대한 디버깅 정보를 저장하기 위한 파일 형식(Microsoft에서 개발)입니다.PDB 파일의 확장자는 일반적으로 .pdb입니다.PDB 파일은 일반적으로 컴파일 중에 소스 파일에서 생성됩니다.모듈 내의 모든 심볼 목록을 주소, 파일 이름 및 심볼이 선언된 행과 함께 저장합니다.이 기호 정보는 공간을 많이 차지하기 때문에 모듈 자체에 저장되지 않습니다.
적용들
프로그램이 디버깅되면 디버거는 PDB 파일에서 디버깅 정보를 로드하고 이를 사용하여 심볼을 찾거나 프로그램 소스 코드의 현재 실행 상태를 관련짓습니다.Microsoft Visual Studio에서는 PDB 파일을 기본 파일 형식으로 사용하여 정보를 디버깅합니다.
PDB 파일의 또 다른 용도는 사용자로부터 크래시 데이터를 수집하여 크래시의 원인이 되는(또는 크래시의 원인이 되는) 소스 코드의 특정 부분과 관련짓는 서비스입니다.
Microsoft 컴파일러는 적절한 옵션 하에 컴파일된 원본에서 발견된 유형에 대한 정보를 단일 PDB에 저장합니다.각 소스에 고유한 디버깅 정보는 컴파일된 오브젝트 파일에 저장되며 PDB의 유형에 대한 참조가 포함됩니다.각 컴파일에서는 아직 발견되지 않은 유형이 PDB에 추가되어 이미 컴파일된 오브젝트 파일의 참조가 유효한 상태로 유지됩니다.
Microsoft 링커는 적절한 옵션 하에 입력 모듈에서 검출된 디버깅 정보, 이들 모듈에서 참조되는 유형 및 링커에서 생성된 기타 정보를 조합한 완전히 새로운 PDB를 구축합니다.링크가 증분 실행되면 추가 또는 교환된 모듈에 관한 정보만 추가하고 PDB에 없는 새로운 유형을 추가함으로써 기존 PDB를 변경한다.
PDB 파일은 일반적으로 프로그램의 배포 패키지에서 제거됩니다.디버깅 중에 개발자가 시간을 절약하고 통찰력을 얻기 위해 사용합니다.
정보 추출
PDB 형식은 여기에 기재되어 있습니다.Microsoft Windows에서 사용할 수 있는 DIA(Debug Interface Access) 인터페이스를 사용하여 PDB 파일에서 정보를 추출할 수 있습니다.또한 radare2 및 pdbparse와 같은 PDB에서 정보를 추출할 수 있는 서드파티 툴도 있습니다.
다중 스트림 형식
PDB는 스트림이라고 하는 여러 개의 하위 파일로 논리적으로 구성된 단일 파일입니다.컴파일 및 증분 링크에 의해 실행되는 것처럼 PDB에 대한 변경 프로세스를 최적화하도록 설계되었습니다.스트림은 다른 스트림을 다시 쓰지 않고 삭제, 추가 또는 교체할 수 있으며 스트림을 설명하는 메타데이터에 대한 변경도 최소화됩니다.
PDB는 고정 크기 페이지(일반적으로 1K, 2K 또는 4K)로 구성되며 0부터 순서대로 번호가 매겨집니다.
주의: 모든 숫자 정보 (스트림 번호, 페이지 번호 등)는 인텔 x86 기반 프로세서의 네이티브 형식인 리틀 엔디안 형식으로 저장되는 것으로 간주됩니다.pdbparse Python 코드는 다음과 같이 가정합니다.
개울.
PDB의 각 스트림은 여러 페이지를 차지하지만 반드시 연속적으로 번호가 매겨질 필요는 없습니다.스트림에는 숫자와 길이가 있습니다.스트림 콘텐츠는 해당 페이지의 연결로 스트림 길이로 잘립니다.
메타데이터 형식
PDB 메타데이터의 기능은 모든 컴포넌트 스트림을 식별하고 각 스트림의 페이지 길이와 순서를 지정하는 것입니다.스트림은 0부터 순서대로 번호가 매겨집니다.또한 메타데이터의 일부를 포함하는 루트 스트림 unnumbered도 있습니다.
헤더
PDB는 헤더로 시작합니다.이 헤더는 다음과 같습니다.
- 시그니처. 특정 포맷을 식별하고 검증하기 위해 사용됩니다.시그니처의 길이는, 특정의 형식에 따라서 다릅니다.
- 헤더의 나머지 부분은 시그니처에 의해 식별되는 형식에 따라 달라집니다.
헤더는 1페이지보다 길 수 있습니다.
Microsoft 툴에서는, 다음의 2개의 PDB 형식을 사용합니다.
버전 2
시그니처는"Microsoft C/C++ program database 2.00\r\n\032JG\0\0"
(44 바이트).
헤더의 나머지 부분은 다음과 같습니다.
- 페이지 크기, 4바이트
- 시작 페이지, 2바이트
- 파일 페이지 수, 2바이트.
- 루트 스트림사이즈, 4바이트
- 예약 완료, 4바이트
- 루트 스트림 페이지 번호 목록(페이지당 2바이트)으로 위의 루트 스트림 크기를 커버하기에 충분합니다.
버전 7
시그니처는"Microsoft C/C++ MSF 7.00\r\n\x1ADS\0\0\0"
(32 바이트).
헤더의 나머지 부분은 다음과 같습니다.
- 페이지 크기, 4바이트
- 할당 테이블 포인터, 4바이트이것의 의미는 알 수 없다.PDB의 말미에 65,536비트(8,192바이트)의 배열인 할당 테이블이 있는 것 같습니다.1비트는 사용되지 않는 페이지를 의미합니다.
- 파일 페이지 수, 4바이트.
- 루트 스트림사이즈, 4바이트
- 예약 완료, 4바이트
- 루트 스트림 페이지 번호 목록의 페이지 번호.루트 스트림 자체의 위치는 표시되지 않고 해당 페이지를 가리키는 구조를 포함하는 페이지만 나타냅니다.이 페이지에서 루트 스트림 페이지 번호 목록은 루트 스트림이 저장된 페이지를 나타냅니다.페이지당 4바이트로 위의 루트 스트림 크기를 커버하기에 충분합니다.
루트 스트림
루트 스트림은 스트림0부터 시작하는 모든 PDB 스트림을 나타냅니다.내용은 PDB 형식 버전에 따라 다릅니다.
버전 2
루트 스트림은 다음과 같이 구성됩니다.
- 스트림 수, 2바이트
- 예약 완료, 2바이트
- 각 스트림에 대해:
- 스트림 크기, 4바이트
- 예약 완료, 4바이트
- 각 스트림에 대해:
- 스트림 페이지 번호 목록(페이지당 2바이트), 위의 스트림 크기를 커버하기에 충분합니다.
버전 7
루트 스트림은 다음과 같이 구성됩니다.
- 스트림 수, 4바이트
- 각 스트림에 대해:
- 스트림 크기, 4바이트
- 각 스트림에 대해:
- 스트림 페이지 번호 목록(페이지당 4바이트), 위의 스트림 크기를 커버하기에 충분합니다.
콘텐츠 스트리밍
Microsoft 툴은 다양한 종류의 정보를 다른 번호의 스트림에 저장합니다.스트림 번호에 따라서는 고정 정보 타입이 관련지어져 있는 것도 있고, 상기의 고정 타입 스트림으로 식별되어 있는 것도 있습니다.
스트림 1은 PDB가 실행 파일스트림 또는 오브젝트파일 스트림에서 참조되는 파일과 동일한지 확인하기 위해 사용됩니다.
- 버전, 4바이트
- 타임스탬프, 4바이트
- 에이징, 4바이트이 PDB가 생성된 이후 변경된 횟수입니다.
- GUID, 16바이트
- 다음 이름의 총 길이 4바이트입니다.뒤에 늘 종단 문자열이 붙습니다.
스트림 2 및 스트림4에는 유형 정보가 보관 유지됩니다.실제 유형 레코드는 프로그램에서 사용되는 유형을 정의합니다.이러한 레코드의 구조는, Microsoft 가 제공하는 cvinfo.h 파일에 기재되어 있습니다.레코드에는 두 가지 플레이버가 있으며 각각 자체 인덱스 번호 세트를 가지고 있습니다.타입 ID와 타입은 스트림2에 저장되며 타입 ID만 스트림4에 저장됩니다.색인은 기호 레코드 및 기타 유형 레코드 내에서 이러한 레코드를 참조하는 데 사용됩니다.
- 머리글:
- 버전, 4바이트
- 헤더 사이즈, 4바이트
- 유형 레코드의 최소 및 최대(마지막 + 1) 인덱스(각 4바이트).
- 스트림 끝까지의 후속 데이터 크기(4바이트).
- 해시 정보:
- 스트림 번호, 2바이트, 2바이트 패딩.
- 해시 키, 4바이트
- 버킷, 4바이트
- HashVals, TiOff 및 HashAdj는 각각 오프셋과 길이로 구성되며 각각 4바이트입니다.
- 위의 헤더에서 레코드, 가변 길이, 카운트 =(최대 - 최소)를 입력하십시오.
스트림 3은 다른 스트림의 디렉토리입니다.버전 2에도 컴파일러에 의해 작성된PDB에도 없습니다.스트림은 헤더로 시작하여 총 64바이트로 패딩됩니다.
오프셋 | 크기 | 이름. | 묘사 |
---|---|---|---|
0 | 4 | 서명 | 헤더 식별자 == 0xFFFFFF |
4 | 4 | Header Version(헤더 버전) | 헤더의 버전 |
8 | 4 | 나이 | |
12 | 2 | snGSSyms | |
14 | 2 | usVerall | 조합 { 구조 { 호트 usVerPdbDllMin : 8; // 마이너 버전 및 호트 usVerPdbDllMaj : 7; // 메이저버전 및 호트 fNewVerFmt : 1; // 다른 곳에 rbld가 저장되어 있음을 나타내는 플래그(원래 메이저버전의 높은 비트) } 봄; // 이 pdb를 마지막으로 구축했습니다. 구조 { 호트 usVerPdbDllRbld: 4; 호트 usVerPdbDllMin : 7; 호트 usVerPdbDllMaj : 5; } 표시하다; 호트 usVerall; }; |
16 | 2 | snPSSyms | |
18 | 2 | usVerPdbDllBuild | 이 pdb를 마지막으로 빌드한 pdb dll 빌드 버전 |
20 | 2 | snSymRecs | |
22 | 2 | VerPdbDllRLD | 이 pdb를 마지막으로 빌드한 pdb dll의 rbld 버전 |
24 | 4 | cbGpModi | rgmodi 서브스트림 크기 |
28 | 4 | CBSC | 섹션 기여 하위 스트림 크기 |
32 | 4 | cbSecMap | 단면도 크기 |
36 | 4 | cbFileInfo | 파일 정보 스트림 크기 |
40 | 4 | cbTSmap | 유형 서버 맵 하위 스트림 크기 |
44 | 4 | iMFC | MFC 인덱스 |
48 | 4 | cbDbgHdr | 스트림 끝에 추가된 선택적 DbgHdr 정보의 크기 |
52 | 4 | cbECInfo | EC 하위 스트림의 바이트 수 또는 EC 지원 Mod가 없는 경우 0 |
56 | 2 | 플래그 | 구조 _개요 { 호트 fIncLink:1; // 링크되어 있는 경우 true(실제로 링크되어 있는 경우에만 true) 호트 흐트러졌다:1; // PDB의 경우 true::CopyPrivateData를 삭제하려면 호트 fCT타입:1; // 이 PDB가 CTypes를 사용하는 경우 true입니다. 호트 미사용의:13; // 예약. 0이어야 합니다. } 플래그; |
58 | 2 | 기계 | COFF 오브젝트 포맷에서 사용되는 것과 동일한 머신 ID(인텔 x86 64비트용 16진수 8664 등) |
60 | 4 | 예약필 | 향후 확장, 64바이트로 패딩 |
- 모듈 정보, 가변 길이위 헤더의 총 크기입니다.링커에 의해 사용되는 오브젝트 모듈별로 다음 중 하나가 있습니다.
- 오픈, 4바이트
- 기호 정보
- 섹션 번호, 2바이트 + 2바이트 패딩.
- 오프셋과 크기, 각각4 바이트
- 플래그, 4바이트
- 모듈 번호, 2바이트 + 2바이트 패딩
- 섹션 데이터 및 재배치 데이터에 대한 CRC(각 4바이트).
- 플래그, 2바이트
- 스트림 번호, 2바이트
- 기호 크기, 4바이트.
- 구회선 번호 및 신회선 번호 정보 크기(각각 4바이트).
- 소스 파일 수, 2바이트 + 2바이트 패딩.
- 오프셋, 4바이트
- niSource 및 niCompiler, 각각4 바이트
- 모듈 이름, 늘 종단 바이트 문자열.
- 개체 이름, null 종단 바이트 문자열입니다.
- 4바이트의 배수로 패딩합니다.
- 섹션 투고, 섹션 헤더, 파일 정보, TS 맵 및 EC 정보.이러한 사이즈는 위의 헤더에 기재되어 있습니다.
- 디버깅 헤더,
- 이전 프레임 포인터 누락, 예외, 수정, 소스와의 객체 맵, 섹션 헤더, 토큰 링 ID, Xdata, Pdata, 새 프레임 포인터 누락 및 섹션 헤더 오리진의 스트림 번호.각각 2바이트