본문 바로가기
IT-개발,DB

[개발] .PDB 및 .DBG 파일에 대한 설명

by SB리치퍼슨 2010. 11. 4.

Debug Basic

요약

.PDB 확장명은 "프로그램 데이터베이스"를 나타내며 .PDB 파일에는 Visual C++ 버전 1.0에 도입된 디버깅 정보를 저장하는 새로운 형식이 포함되어 있습니다. 앞으로 .PDB 파일에는 기타 프로젝트 상태 정보도 포함될 예정입니다. 형식을 변경한 가장 중요한 이유 중 하나는 점점 늘어나는 프로그램 디버그 버전의 연결을 가능하게 하기 위한 것으로 이러한 변경은 Visual C++ 버전 2.0에서 처음 도입되었습니다. -> .PDB 확장명을 가진 파일은 디버깅 정보를 가지고 있는 중요한 파일이다.

.DBG 확장명은 "디버그"를 나타냅니다. 32비트 NT 도구 집합으로 만든 .DBG 파일은 PE(Portable Executable) 파일 형식으로 되어 있고 COFF, FPO 및 경우에 따라 Codeview 정보가 있는 섹션을 포함합니다. Visual C++ 통합 디버거는 이 형식으로 된 .DBG 파일을 읽을 수 있지만 COFF 기호 섹션을 무시하고 Codeview 정보를 찾습니다.

.DBG 파일에 포함되어 있는 기호 정보를 확인하려면 명령 프롬프트에서 아래와 같이 입력합니다.
 
Dumpbin sample.dbg/symbol
 
참고 경로에 Dumpbin.exe와 MSdis100.dll의 디렉터리를 포함해야 할 수도 있습니다.
Path=%Path%;C:\Program Files\DevStudio\VC\bin;C:\Msssdk\bin
 
 
DUMPBIN에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
 
177429 (http://support.microsoft.com/kb/177429/) DUMPBIN 유틸리티에 대한 설명
 

추가 정보

.PDB 파일

이전의 16비트 버전 Visual C++에서 .PDB 파일을 사용할 때는 이 파일에 저장되어 있던 디버깅 정보가 링커에 의해 .EXE 파일이나 .DLL 파일의 끝에 추가되었습니다. 위에서 언급한 Visual C++ 버전에서는 디버깅 프로세스 동안 직접 .PDB 파일을 사용할 수 있도록 링커와 통합 디버거가 수정되어 링커 작업이 크게 줄었으며 번거로운 CVPACK 64K 형식 제한도 피할 수 있습니다.

CVPACK 제한에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
112335 (http://support.microsoft.com/kb/112335/) BUG: 형식 정보가 64K를 초과할 때 발생하는 CK1020 또는 CK4009
기본적으로 Visual Workbench로 생성된 프로젝트를 빌드할 때는 컴파일러 스위치 /Fd가 사용되어 .PDB 파일의 이름이 <project>.PDB로 변경됩니다. 따라서 전체 프로젝트에 대해 하나의 .PDB 파일만 있게 됩니다.

Visual Workbench로 생성되지 않은 메이크파일을 실행할 때 /Fd를 /Zi와 함께 사용하지 않으면 최종적으로 다음 두 개의 .PDB 파일이 있게 됩니다.
VCx0.PDB(여기서 "x"는 해당 Visual C++의 주요 버전을 나타내며 "2" 또는 "4"임) - .OBJ 파일 각각에 대한 디버깅 정보를 모두 저장하고 있습니다. 프로젝트 메이크파일이 있는 디렉터리에 있습니다.
<project>.PDB - 최종 .EXE 파일의 모든 디버깅 정보를 저장하고 있습니다. \WINDEBUG 하위 디렉터리에 있습니다.
두 개의 파일이 만들어진 이유는 다음과 같습니다. 실행 시 컴파일러는 .OBJ 파일이 연결될 .EXE 파일의 이름을 모르므로 <project>.PDB에 해당 정보를 넣을 수 없습니다. 두 파일은 서로 다른 정보를 저장합니다. 사용자가 .OBJ 파일을 컴파일할 때마다 컴파일러가 디버깅 정보를 VCX0.PDB에 병합합니다. 함수 정의 같은 기호 정보는 넣지 않고 형식 관련 정보만 넣습니다. 이 경우 한 가지 이점은 모든 소스 파일에 <windows.h> 같은 공통 헤더 파일이 있을 경우 이러한 헤더의 모든 형식 정의가 모든 .OBJ 파일에 저장되는 것이 아니라 한 번만 저장된다는 것입니다.

링커를 실행하면 해당 프로젝트의 .EXE 파일에 대한 디버깅 정보가 포함되어 있는 <project>.PDB가 생성됩니다. 함수 프로토타입과 기타 모든 사항을 포함하여 모든 디버깅 정보는 VCX0.PDB에 있는 형식 정보에만 저장되는 것이 아니라 <project>.PDB에도 저장됩니다. 두 종류의 .PDB 파일은 구조적으로 유사하므로 같은 확장명을 공유하며 둘 다 증분 업데이트를 허용하지만 실제로는 서로 다른 정보를 저장합니다.

새 Visual C++ 디버거는 링커에 의해 생성된 <project>.PDB 파일을 직접 사용하며 .PDB 파일의 절대 경로를 .EXE 또는 .DLL 파일에 포함합니다. 디버거가 해당 위치에서 .PDB 파일을 찾을 수 없거나 프로젝트가 다른 컴퓨터로 이동한 경우와 같이 경로가 잘못되면 디버거가 현재 디렉터리에서 .PDB 파일을 찾습니다.
 

.DBG 파일

Visual C++ 통합 디버거는 또한 .DBG 파일이 Codeview 형식 디버깅 출력을 포함하고 있는 이진 영역에서 만들어진 경우 .DBG 파일도 사용할 수 있습니다. .DBG 파일은 소스 코드를 사용할 수 없을 때 디버깅하는 데 유용합니다. 소스가 없어도 .DBG 파일을 사용하여 함수에 중단점을 설정하고 변수를 조사하며 호출 스택에서 함수를 볼 수 있습니다. 이 파일은 OLE RPC 디버깅에도 필요합니다.

한 가지 주의해야 할 점은 .DBG 파일의 기호로 작업할 때는 완전 데코레이팅된 이름을 사용해야 한다는 것입니다. 예를 들어 Windows sndPlaySound 함수 호출에 중단점을 설정하려면 _sndPlaySoundA@8을 위치로 지정합니다.

실제로 두 가지의 .DBG 파일 형식이 있습니다. 이전 형식은 16비트 환경에서 상당히 오래동안 사용되었습니다. .COM 파일의 형식은 메모리에 로드되는 단순 이진 이미지이므로 Codeview 디버깅 정보를 .COM 파일의 끝에 추가하면 파일 크기가 64K 제한을 초과할 수도 있기 때문에 파일 끝에 Codeview 디버깅 정보를 추가할 수 없습니다. 따라서 기호 정보는 Codeview 정보만 들어 있는 별도의 .DBG 파일에 대신 저장됩니다. .EXE 파일에서 /strip 옵션으로 CVPACK를 실행하여 .DBG 파일을 생성할 수도 있습니다.

32비트 .EXE의 경우 Visual C++ 버전 2.x 및 4.x 디버거의 기호 처리기가 이전 형식을 읽지 못하며 대신 Windows NT .DBG 파일에서 사용되는 형식을 읽습니다. 이 형식은 시스템 .DLL 파일과 함께 사용하도록 제공됩니다. 이러한 .DBG 파일은 PE 파일 형식으로 되어 있고 COFF, FPO 및 경우에 따라 Codeview 기호 정보가 있는 섹션을 포함합니다. 새로운 Visual C++ 디버거는 이 형식으로 된 .DBG 파일만 읽습니다. 또한 Codeview 정보만 사용하고 다른 기호 섹션은 무시합니다.

디버그 정보를 PE 파일에서 추출하여 .DBG 파일에 저장해 두었다가 디버거에서 사용할 수 있습니다. 이렇게 하려면 디버거가 별도의 파일에서 디버그 정보를 찾을지 또는 해당 정보를 파일에서 추출했는지 여부를 알고 있어야 합니다. 한 가지 방법은 디버거가 디버그 정보를 찾는 실행 파일을 검색하는 것입니다. 그러나 파일에서 추출했음을 나타내는 파일 특성 필드(IMAGE_FILE_DEBUG_STRIPPED)가 개발되어 디버거가 더 이상 파일을 검색하지 않아도 됩니다. 디버거는 PE 파일 헤더에서 이 필드를 찾아 디버그 정보가 해당 파일에 있는지 여부를 빠르게 확인할 수 있습니다.

Win32 SDK와 함께 제공되는 REBASE.EXE를 사용하여 이 형식으로 된 .DBG 파일을 생성할 수 있습니다. 자세한 내용은 Win32 SDK 설명서를 참조하십시오.

Windows NT 정품을 구축하는 동안 디버그 기호가 시스템 바이너리와 드라이버에서 추출되어 별개의 .DBG 파일에 저장됩니다. 이렇게 하는 이유는 Windows NT 커널 디버거가 이러한 .DBG 파일을 사용하여 최적화된 드라이버에 대해서도 디버깅 기호를 제공할 수 있기 때문입니다. 그러나 Visual C++ 통합 디버거는 보호 모드 커널 코드를 디버깅하기 위한 것이 아닙니다.

Windows NT 기호 파일은 Windows NT 정품 CD-ROM에 있는 \SUPPORT 디렉터리의 디버그 하위 디렉터리에 있습니다. 이 기호 파일은 CD-ROM에서 하드 드라이브로 복사해야 합니다. 대상 디버거 시스템에서 수행되는 사용자 모드 디버깅의 경우 .DBG 기호는 대상 시스템의 Windows NT \<winnt>\SYMBOLS 디렉터리에 있어야 합니다. 여기서 <winnt>는 Windows NT가 설치되어 있는 디렉터리입니다. 새로운 Visual C++ 설치 프로그램은 프로그램 그룹에 "NT 시스템 기호 설치" 아이콘을 설치합니다. 이 아이콘을 사용하면 Windows NT Workstation CD-ROM 디스크에서 하드 드라이브의 올바른 디렉터리 구조로 .DBG 파일을 자동 복사할 수 있습니다. Windows NT Server 4.0 CD-ROM에서는 .DBG 파일이 압축 형식으로 저장되어 있기 때문에 이 방법이 적용되지 않습니다.

커널 디버깅을 위해서는 _NT_SYMBOL_PATH 환경 변수에서 지정하는 디렉터리(예: C:\DEBUG\SYMBOLS) 아래의 기호 트리에 .DBG 파일을 넣어야 합니다. 커널 디버깅은 SYMBOLS\SYS 디렉터리의 모든 드라이버(*.SYS)에 대한 기호, SYMBOLS\EXE 디렉터리의 NTOSKRNL.EXE에 대한 기호 및 SYMBOLS\DLL 디렉터리의 HAL.DLL에 대한 기호로 구성된 최소한의 기호 집합으로 가능합니다. 커널 디버깅에 대한 자세한 내용은 Windows NT DDK Programmer's Guide에서 커널 디버깅 관련 설명을 참조하십시오.

.PDB 파일에서 다시 .DBG 파일로 변환하는 작업은 이론적으로 가능하지만 매우 복잡한 작업입니다. 이러한 도구에 대한 정보는 현재 없습니다. 이러한 도구에 대한 정보를 구하면 Microsoft 기술 자료에서 이 문서가 업데이트될 것입니다.
 
 
----------------------------------------------------------------------------------------
 솔직히 저도 위에 내용을 전부다 이해하지 못합니다. 다만. WinDBG를 사용하면서 정말 강력하고 좋다고 생각하던 중에 위 내용을 microsoft.com 페이지에서 찾아서 여러분들과 공유하고자 올려 놓았습니다. 그냥 참고 하시면 좋을것 같습니다.
 
출처 : support.microsoft.com (Another Developer's BIBLE)
반응형

댓글