분석하기 난감한 경우가 UI 쓰레드가 행이 걸려서 마우스나 키보드에 반응하지 않거나(데드락인 경우도 포함), 어떤 쓰레드에서 무한루프에 빠져서 CPU를 과도하게 사용하고 있는 경우다. 이럴 때 오류코드를 찾아내는 방법을 알아보겠다.
Windbg 다운로드
http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx
Procexp 다운로드
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
1. Procexp.exe 를 실생시켜서 CPU를 과도하게 차지하고 있거나 데드락에 빠져서 응답이 없는 프로그램의 프로세스를 선택하여 마우스 우클릭한다.
2. Create dump > Create mini dump 를 실행여 덤프 파일을 만든다.
XP 경우 dbghelp.dll 이 없거나 버전이 낮은 경우 Options > Configure Symbols... 에서 dbghelp.dll 파일을 지정할 수 있다. Win비스타이상의 경우 작업관리자에서 우클릭하여 덤프 파일을 생성할 수 있으나 이 경우 풀덤프라서 몇 백메가 정도의 용량을 차지한다.
3. Windbg.exe 실행
4. FIle > Symbol file path (Ctrl + S) 에서 PDB 파일이 있는 경로를 지정한다.
경로에 아래를 추가 해 두면 윈도즈OS의 모듈에 대한 내부 함수명을 포함한 콜스택을 볼 수 있다. c:\WebSymbos에 동적으로 관련 심볼파일을 다운로드 받기 때문에 용량을 좀 차지한다.
srv*C:\WebSymbols*http://msdl.microsoft.com/download/symbols;
5 Open Crash Dump(Ctrl + D)로 Dump 을 연다.
( 개발자 PC에서 발생한 경우라면 File > Attach to a process 명령어를 사용하여 실행중인 프로세스에 바로 디버거를 붙일 수 있다. 이 경우 1 ~ 2 단계는 생략할 수 있다. )
6. 명령어에
~*
를 입력한다.
크래시가 발생했을 경우에는
!analyze -v
명령어를 많이 사용한다.
7. View > processes and Threads
View > Call stack
창 두 개를 띄우고 쓰레드창에서 각 쓰레드 항목을 더블클릭하여 콜 스택창에서 현재 실행중인 콜스택을 확인한다.
무한루프 CPU 100% 발생 코드
void CToolbarDlg::OnAbout()
{
class CLoopthread : public dfx::SimpleThread
{
public:
virtual UINT Run()
{
__int64 count = 0;
while( true )
count ++ ;
}
};
(new CLoopthread())->Start();
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
윈도우 디버거로 분석한 결과