[windbg] symbol load

wangki·2025년 4월 21일

debugging

목록 보기
1/1

symbol load하기

WinDbg를 활용해서 디버깅을 할 때 breakpoint를 거는 것은 필수적이다.
그러나 pdb symbol이 로드되지 않는다면 소스코드를 보면서 할 수 없다.
간단한 명령어로 쉽게 로드할 수 있는 방법이 있다.

1. pdb가 모듈과 같은 경로에 있는 경우


기본적으로 빌드하게 되면 dll과 pdb가 함께 생성된다. dll과 pdb를 함께 다른 실행파일 경로로 옮긴다. 이 후 해당 실행파일을 실행하여 windbg를 통해서 심볼을 확인하면 로드된걸 확인할 수 있다.


int main()
{
	auto handle = LoadLibraryA("dll_main_test.dll");

	if (handle == NULL) {
		printf("DLL Load Failed\n");
		return 0;
	}

	//Sleep(INFINITE);

	FreeLibrary(handle);
}

위 코드를 빌드한 실행파일을 windbg로 실행한다.

x consoleapplication7!*main*

명령어를 실행 후 어드레스를 bp 명령어로 실행하게되면 main에 중단점이 걸리게 된다.

LoadLibraryAdll_main_test.dll을 로드시킨 뒤 lm 명령어로 정상적으로 모듈이 로드된지 확인한다.


dll_main_test옆에 private pdb symbols라고 나온다.

x 명령어로 dllmain의 주소값을 구한 뒤 breakpoint를 걸 수 있다.

중단점 리스트를 확인하면

소스코드가 정상적으로 활성화된 걸 볼 수 있다.

2. pdb파일이 모듈과 분리되어 있는 경우


pdb파일이 없다. 1번처럼 로드한다.

export symbols라고 나온다.

위 처럼 DllMain에 중단점을 설정했지만 소스코드가 활성화되지 않는다. 이것은 pdb가 정상적으로 로드되지 않아서이다.

.sympath+ 명령어로 추가할 수 있지만 file - settings - Debugging settings에서 Symbol path를 설정할 수 있다.

해당 dll을 빌드할 당시 함께 생성된 pdb파일이 있는 경로를 입력해준다.


확인을 하게 되면 위 사진처럼 다시 로드되는걸 볼 수 있다. 다시 lm명령어로 로드된 모듈을 확인한다.

정상적으로 private pdb symbols로 로드된걸 확인할 수 있다.

중단점 리스트도 확인하면 소스코드가 활성화된 것을 확인할 수 있다.

만약 정상적으로 로드되지 않았다면 .reload /f 모듈명을 입력해보자.

-끝-

0개의 댓글