PDB(Program DataBase)
PDB의 활용
0. 개요
PDB : Program DataBase의 약자로, Symbol 파일로도 불린다. 각각의 실행 파일(*.exe / *.dll 등)에 대응되는 PDB 파일에는 Debugging을 위한 각종 정보가 기록되어 있습니다. 따라서, [[crash-dump]]{Crash Dump} 분석, Vtune 성능 측정, [[memory-leak]]{Gflags} 분석 등의 Debugging을 하기 위해서는 PDB가 반드시 필요하다.
1. Symbol 서버
'네트워크에 저장되어 있는 PDB 파일'의 '위치'를 저장해놓은 서버이다.
Symbol 서버를 이용하면 분석할 dump에 맞는 PDB 파일들을 자동으로 download해주기 때문에 분석하는 데 좀 더 수월하다.
Symbol 서버가 구축되어 있지 않으면 분석에 필요한 올바른 PDB 파일을 직접 찾아 Local에 저장하여 연결 후 진행해야 한다.
1.1. Symbol 서버 접속 방법
net use "\\192.169.219.18\SymSrv" /user:"hoonti" "P@ssw0rd"
:: Z 드라이브로의 연결
net use Z: "\\192.169.219.18\SymSrv" /user:"hoonti" "P@ssw0rd"
1.2. Symbol 서버 구축 방법
참고 : dbg_amd64_6.12.2.msi'가 반드시 설치되어 있어야 한다.
:: ------- Do NOT Touch (START Line) -------
setlocal
:: cmd창에 한글을 출력하기 위한 코드
@chcp 65001 1> NUL 2> NUL
:: ------- Do NOT Touch (End Line) -------
:: 'symstore.exe'를 사용하기 위해 반드시 dbg_amd64_6.12.2.msi를 설치해야 한다.
SET PROJECT_DIR=proj
:: 'PROJECT_DIR'에 맞는 Revision 번호로 변경한다.
SET REVISION=10000
:: ------- Do NOT Touch (START Line) -------
SET MY_SYM_SERVER=\\192.168.219.18\SymSrv
net use "%MY_SYM_SERVER%"
SET PDB_BASE=\\192.168.219.18\pdb
SET PDB_ZIP_FILE=%REVISION%(Release)_pdb.zip
SET PDB_FOLDER=%REVISION%(Release)_pdb
SET PDB_PATH=%PDB_BASE%\%PROJECT_DIR%\%PDB_ZIP_FILE%
SET UNZIP_PDB_PATH=%PDB_BASE%\%PROJECT_DIR%\%PDB_FOLDER%
SET DBG_TOOL_PATH=C:\Program Files\Debugging Tools for Windows (x64)
SET WINDBG_EXE=%DBG_TOOL_PATH%\windbg.exe
SET SYMSTORE_EXE=%DBG_TOOL_PATH%\symstore.exe
:: DBG Tool이 설치되어 있는지 확인
IF NOT EXIST "%DBG_TOOL_PATH%" (
echo "'dbg_amd64_6.12.2.msi'를 설치하고 다시 실행해주십시오"
pause
exit /b
)
:: 압축 해제를 한다.
Call :UnZipFile "%UNZIP_PDB_PATH%" "%PDB_PATH%"
:: Symbol 서버에 PDB 연결
"%SYMSTORE_EXE%" add /r /p /f "%UNZIP_PDB_PATH%\*.*" /s %MY_SYM_SERVER%
/t "%PROJECT_DIR%" /v "%PROJECT_DIR%" /c "Built from %PROJECT_DIR%"
net use /d "%MY_SYM_SERVER%"
pause
exit /b
:UnZipFile <ExtractTo> <newzipfile>
set vbs="%temp%\_.vbs"
if exist %vbs% del /f /q %vbs%
>%vbs% echo Set fso = CreateObject("Scripting.FileSystemObject")
>>%vbs% echo If NOT fso.FolderExists(%1) Then
>>%vbs% echo fso.CreateFolder(%1)
>>%vbs% echo End If
>>%vbs% echo set objShell = CreateObject("Shell.Application")
>>%vbs% echo set FilesInZip=objShell.NameSpace(%2).items
>>%vbs% echo objShell.NameSpace(%1).CopyHere(FilesInZip)
>>%vbs% echo Set fso = Nothing
>>%vbs% echo Set objShell = Nothing
cscript //nologo %vbs%
if exist %vbs% del /f /q %vbs%
:: ------- Do NOT Touch (END Line) -------
2. PDB 경로 등록 방법
Visual Studio 에는 PDB 파일 저장 서버(NAS)나 Symbol 서버의 주소를 그냥 적으면 되지만, 만일 환경 변수나 Vtune Amplifier에 등록하기 위해서는 아래의 규칙을 참고하여 적어야 한다.
- PDB 파일 저장 서버(NAS) : 경로를 직접 적는다.
- Symbol 서버 : 아래의 문법에 맞춰 적는다.
- srv*[Local에서 Symbol을 저장할 Cache 폴더 경로]*[Symbol 서버 주소]
- 예시
- srv*D:\Symbol*\192.168.219.18\SymSrv
- srv*D:\Symbol*\msdl.microsoft.com\download\symbols
- 참고 : 여러 Symbol 서버에 대해 하나의 'Local Cache 폴더'를 지정해도 된다.
3. _NT_SYMBOL_PATH 환경 변수 선언
Gflags 등을 쓰기 위해서는 _NT_SYMBOL_PATH 라는 환경 변수에 PDB 경로를 등록해야 한다.
여러 개의 PDB 경로를 나열할 때에는 ';'으로 구분해야 한다.
예를 들어, Windows Symbol Server와 Symbol 서버, 그리고 Local의 파일들(ex> C:\localPDB)을 등록하려면 하기와 같이 입력하면 된다.
set _NT_SYMBOL_PATH=srv\*D:\symbol\*https://msdl.microsoft.com/download/symbols;
srv\*D:\symbol\*\\192.168.219.18\SymSrv;
D:\localPDB
참고 : 시스템 환경 변수 설정을 통해 환경 변수를 설정할 수도 있지만, 해당 변수가 계속 유지되기 때문에 bat파일을 통한 환경 변수 설정을 하는 것을 추천한다.