Windows .dmp 분석

# 방법1 - visual studio 이용
디버깅시 소스를 보려면 .exe .pdb .dmp 이 같은 위치에 있도록 한다.
visual studio 에서 프로젝트로 .dmp 열기 -> 디버깅 시작(F5) -> 프로그램이 죽은 시점의 콜스택과 소스를 볼 수 있다.

만약 .pdb 가 있어도 콜스택과 소스코드가 제대로 보이지 않으면 윈도우 기본 심볼 파일을 다운 받고(방법2 참고)
옵션 -> 디버깅 -> 기호 -> 기보파일(.pdb) 위치를 설정한다.(기호로드는 시간이 오래걸리고 진행상태를 알 수 없어 추천하지 않는다.)


위와 같이 설정하고 디버깅 시작하면 제대로된 콜스택과 윈도우 시스템의 소스코드를 볼 수 있다.
콜스택에서 사용자 함수를 클릭하면 해당 소스를 요구하고 이때 소스(.cpp) 경로를 직접 입력하도록 한다.

# 방법2 - windbg 이용
Windbg 는 크래쉬 발생시 생성된 덤프파일(.dmp) 분석을 위해 visual studio 외에 사용할 수 있는 툴이다.
다운로드 http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx

File -> Symbol File Path 에 다음과 같이 설정한다.
SRV 는 심볼을 사용하겠다는 뜻
D:\WindowsSymbols 는 심볼 다운 받아 저장할 곳
http://msdl.microsoft.com/download/symbols 는 심볼을 다운로드할 url
d:\ysoftman\ysoftman_application 는 .pdb 파일이 있는 위치
SRV*D:\WindowsSymbols*http://msdl.microsoft.com/download/symbols;d:\ysoftman\ysoftman_application

소스 파일이 있다면 File -> Source File Path 를 주고 call stack 등에서 더블클릭하면 해당 소스가 보이게 된다.

크래시 분석 수행
!analyze -v

쓰레드별 lock 상태 보기
!locks

참고로 critical section 에서의 lock count 은 초기값이 -1 이다.
lock count 는 각각의 쓰레드가 EnterCriticalSection 를 호출할 때마다 증가 되고 LeaveCriticalSection 를 호출할 때마다 감소된다.

lock count 현재 critical section 을 점유한 쓰레드 외에 EnterCriticalSection 를 통해 대기중인 쓰레드 개수를 나타낸다.

그런데 lock count 가 -1 보다 작아질 수 있는 버그가 있어 windows server 2003 sp1 이후에는 lock count 해석하는 방법이 달라졌다

자세한 내용은 http://msdn.microsoft.com/en-us/library/windows/hardware/ff541979(v=vs.85).aspx

comments:

댓글 쓰기