이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

Tool 사용법/WinDBG

WinDBG Symbol File 이란?

이쿠우우 2020. 9. 11. 19:56
반응형

 

Symbol File (심볼 파일) 이란?

디버그 심볼 파일이란 실행 파일을 빌드할 때 생성되는 디버그용 파일.

심볼 파일이 or 심볼이라고 불러짐

심볼 파일에 포함되는 정보
실행 파일안에 존재하는 함수, 변수의
이름, 위치, 소스 파일, 소스 라인 정보.

Visual studio나 WinDbg 같은 비거거는 이 심볼 파일을 이용해 

소스 라인 디버깅을 가능하게 함

 

 

심볼 파일 생성법

Visual studio 의 경우

Debug 빌드 시 자동 생성

Release 빌드는 생성 되지 않음

하지만 Release 빌드라도 심볼 파일은 생성해놔야 함

(디버깅을 위해)

 

Relase 빌드에서 심볼 생성 방법

1. 프로젝트 메뉴의 속성

2. 상단의 구성(Configuration) 을  [Release] or [All Configuration] 로 선택

3. 플랫폼(Platform) 비트 선택

4. C/C++ 트리 선택

5. 디버깅 정보 형식을 [프로그램 데이터 베이스(/Zi)] 로 선택

6. 링커 트리를 펼치고 디버깅 선택

7. 디버그 정보 생성을 [예(/DEBUG)]로 설정

8. 프로그램 데이터베이스 파일 생성을 [ (./Release/프로젝트이름.pdb) $(OutDir)$(TargetName).pdb)]로 설정

9. 맵 파일 생성을 [예(/MAP)] 설정

10. Map Exports 를 [YES(/MAPINFO:EXPORTS)] 설정

 

 

 

 

WinDbg 심볼 파일 로드

로드해야 하는 심볼 파일은 크게 운영체제 심볼 파일과 디버깅 하려는 모듈의 심볼 파일로 구분

마이크로소프트는 모든 운영체제의 심볼 파일을 웹 심볼이라는 형태로 제공

기본적으로 웹 심볼의 URL을 심볼 파일 경로에 등록해주면 됨

심볼 형식

SRV*E:/OsSymbols*http://mdsl.microsoft.com/download/symbols;E:\MySymbols

 

심볼 형식 옵션 설명

SRV 

심볼 서버를 사용한다는 의미

E:/OsSymbols

다운로드 받은 심볼 파일을 저장해 놓을 경로
일단 다운로드 받은 심볼 파일들은 다시 다운로드하지 않고
이 디렉토리에 있는 것을 사용하므로 일종의 캐시 개념으로 볼 수 있음

http://mdsl.microsoft.com/download/symbols

웹 심볼 서버의 URL

E:\MySymbols

심볼 파일만 모아두는 별도의 경로가 있는경우 이를 바라보게 하는 설정
세미클론을 이용해 경로 추가 가능

 

 

심볼을 심볼 경로에 포함하는 방법

1. 파일 메뉴 이용

WinDbg 상단의 File > Symbol File Path 선택

Reload 를 체크하고 OK 클릭하면 현재 필요한 모든 심볼 파일을 바로 download 함

 

[참고]

모든 운영체제 파일에 대한 심볼 파일을 바로 다운로드하는 것을 아님
'현재 필요한' 파일만 download 함

 

2. WinDgb 명령어 이용

.symfix E:/OsSymbols 

심볼 파일을 받아옴
microsoft url은 을 입력하지 않아도 알아서 받아옴
저장할 경로만 넣어주거나
뒤에 url 추가해주면 받아옴

 

.sympath

뒤에 인자값 없이 사용하면 현재 심볼 설정을 출력

.sympath+ E:\MySymbols 

경로를 추가해야하는 경우 인자값을 넣어줌
추가할 경우는 세미클론 사용 ";'"
"+" 를 사용시 기존에 설정된 경로에 추가
사용 안할 시 새로 덮어씌어지게됨
(pdb 파일 경로를 추가함)

.srcpath+ E:\MySymbols 

cpp 와 같은 pdb 에 해당하는 소스코드 경로를 넣어줌
해당 설정이 되어있어야 call stack 하고 소스 위치를 클릭했을때
소스 파일의 오류 위치가 보임

 

.reload

상위 설정이 완료되었으면
reload 명령을 해야 심볼을 받아옴

 

.reload /i 프로세스이름 or 라이브러리 이링

.reload 명령으로 pdb 연결이 안되었을 경우
상위 명령으로 강제로 붙임

 

완료 후에 lm 명령으로 pdb 가 정상적으로 붙었는지 확인해야함

 

 

 

 

 

 

 

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

 

 

참고

책 : WinDbg 로 쉽게 배우는 Windows Debugging

 

 

 

 

 

 

 

 

 

 

 

반응형