Skip to content

Latest commit

 

History

History
64 lines (41 loc) · 7.27 KB

Symbol.md

File metadata and controls

64 lines (41 loc) · 7.27 KB

디버그 심볼

디버그 심볼(debug symbol)은 이진 파일(대표적으로 실행 파일, 라이브러리 등)의 기계어를 소스 코드로 변환하여 나타낼 수 있는 정보이며, 이를 통해 컴파일된 원본 스크립트가 필요없이 내부를 들여다 볼 수 있다. 비록 심볼은 원본과 같은 완전한 소스 코드를 재구성하지 못하지만, 변수와 함수의 식별자 및 메모리상 위치하는 주소를 알아낼 수 있다.

윈도우 심볼

윈도우 OS를 관측할 수 있는 정보의 유형과 제약에 따라 심볼을 세 가지로 나눈다.

윈도우 운영체제 심볼 종류
심볼관측 가능한 데이터
Export
  • 함수 (export 테이블 한정)
서버: N/A
Public
  • 함수 (비정적 한정)
  • 전역 변수 (extern 한정)
서버: https://msdl.microsoft.com/download/symbols
Private
  • 함수
  • 전역 변수
  • 지역 변수
  • 사용자 정의 구조체, 클래스, 그리고 자료형
  • 소스 파일 정보: 파일명, 줄번호, 기타 등등

DbgHelp 라이브러리

디버그 지원 라이브러리(debug help library), 일명 DbgHelp 라이브러리는 윈도우 NT 운영체제에서 구동되는 .exe 확장자의 실행 파일을 디버깅하는 데 도움을 주는 함수들을 제공한다. Sysinternals를 포함한 일부 프로그램에서 호출 스택 정보를 보기위해 필요할 수 있으며 윈도우 SDK와 함께 설치된다.

만일 64비트의 NT 버전 10 운영체제(즉, 윈도우 10 및 11)를 위한 DbgHelp 라이브러리는 다음 경로에 위치한다.

%ProgramFiles(x86)%\Windows Kits\10\Debuggers\x64\dbghelp.dll

윈도우에 기본적으로 설치된 %windir%\System32\dbghelp.dll 파일이 존재하지만, 이는 호환성을 위할 뿐이며 SDK로부터 설치한 버전과 달리 디버깅에 사용할 수 없다.

프로그램 데이터베이스

프로그램 데이터베이스, 일명 .pdb 확장자 파일은 해당 모듈의 디버깅 정보가 들어있는 마이크로소프트 형식이며, 그 안에는 심볼도 포함된다.[참고] 비주얼 스튜디오(Visual Studio)로 소스 코드를 빌드하면 이진 파일 외에 함께 생성되는 파일 중 하나이다. 만일 트러블슈팅 과정에서 자체 개발 어플리케이션 등을 함께 분석할 필요가 있으면 해당하는 .pdb 파일이 필요할 수 있다.

심볼 경로

출처: Symbol path for Windows debuggers - Windows drivers | Microsoft Learn

사용자 및 커널 모드 어플리케이션을 디버깅하는데 심볼 파일이 위치한 경로를 지정하는 작업은 매우 중요하다. 디버거가 모듈 내부를 살펴보기 위해 필요한 심볼을 불러올 수 있도록 한다.

심볼을 매번 불러오는 오버헤드를 최소화하기 위해 로컬에 캐싱하는 걸 권장한다.

심볼 캐싱 설정 구문
구문설명
cache*;세미콜론 우측에 기입된 주소로부터 불러온 심볼을 기본 로컬 캐시 경로에 저장한다.
cache*C:\Symbols;세미콜론 우측에 기입된 주소로부터 불러온 심볼을 C:\Symbols 경로에 저장한다.

인터넷이나 사내망으로부터 심볼을 불러올 서버 및 캐시 디렉토리를 지정할 수 있다.

심볼 서버 설정 구문
구문설명
srv*기본 심볼 서버로부터 필요한 심볼을 획득한다.
srv*https://example.comhttps://example.com 서버로부터 필요한 심볼을 획득한다.
srv*C:\Symbols*https://example.comhttps://example.com 서버로부터 필요한 심볼을 획득하여 C:\Symbols 경로에 캐싱한다.

시스템 환경 변수 _NT_SYMBOL_PATH는 하나의 심볼 경로를 다른 디버거 프로그램에 동일하게 적용하는데 매우 유용하게 사용된다. 아래는 환경 변수에 윈도우 심볼을 GUI 혹은 CLI로 지정하는 예시를 보여준다.

환경 변수 <code>_NT_SYMBOL_PATH</code>의 예시

SETX _NT_SYMBOL_PATH SRV*C:\Symbols*https://msdl.microsoft.com/download/symbols

심볼 서버 목록

다음은 개발자들을 위해 기업에서 공개한 심볼 서버들의 목록을 정리한다.

심볼 검증

출처: SymChk - Windows drivers | Microsoft Learn

SymChk 프로그램은 이진 파일과 심볼 파일을 비교하여 올바른지 여부를 확인한다. 윈도우 SDKDebugging Tools for Windows에 포함되며, 해당 프로그램의 64비트 버전은 다음 디렉토리에 위치한다.

  • C:\Program Files (x86)\Windows Kits\10\Debuggers\x64

아래는 ntoskrnl.exe 실행 파일의 심볼을 다운로드 및 검사한다.

symchk "C:\Windows\System32\ntoskrnl.exe" /s SRV*C:\Symbols*https://msdl.microsoft.com/download/symbols