Seize the day

POST : SDP for win32/디버깅

무한루프 행, 데드락에 걸린 프로그램 분석하기

분석하기 난감한 경우가 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();

}


윈도우 디버거로 분석한 결과


top

posted at

2013. 9. 11. 22:41


CONTENTS

Seize the day
BLOG main image
김대정의 앱 개발 노트와 사는 이야기
RSS 2.0Tattertools
공지
아카이브
최근 글 최근 댓글
카테고리 태그 구름사이트 링크