본문 바로가기

카테고리 없음

cpu 사용률이 100% 일 때 원인 찾기

참고 : 'WinDbg로 쉽게 배우는 Windows Debugging' 에이콘 출판사

 

(3) WinDbg를 이용한 방법

 

예제 파일인 LabApp를 실행하고, Threads Hang 버튼을 눌러 문제를 재현합니다.

 


 

CPU 100%를 기록할 때라고 제목을 지어놨는데예제 파일은 50%정도 밖에 안되네요;;; 하지만 프로그램 하나 때문에 50%를 넘는다는 것은 상당한 문제가 되기 때문에 원인을 찾아 보도록 하겠습니다다음으로 WinDbg를 실행하고 [Attach to a Process] 메뉴를 통하여 실행 중인 LabApp에 붙입니다사용자 인터페이스는 정상적으로 반응하고 있는 것으로 봐서 메인 사용자 인터페이스 스레드는 자연스레 용의선상에서 제외하도록 하겠습니다이제 모든 스레드를 의미하는 ‘ ~* ‘ 명령어와 kb명령을 붙여 모든 스레드의 스택을 한꺼번에 살펴 보겠습니다


모두 8개의 스레드가 실행 중인데스택 최상단에 위치한 함수들을 통해 어떤 작업을 수행 중인지 알아낼 수 있습니다. 0번 스레드는 USER32!NTUserGetMessage 함수를 실행하고 있는 것으로 봐서 메인 사용자 인터페이스 스레드임을 알 수 있고, 2, 4, 5, 6번 스레드는 Sleep 함수를 호출해 제어가 정상적인 형태고, 7번 스레드는 WinDbg의 브레이크 모드 진입 스레드입니다. 1, 3번 스레드가 의심스럽지만 3번 스레드만 LabApp.exe ThreadFunc2() 함수에서 열심히 동작 중임을 발견했으므로 제어는 3번 스레드로 변경합니다.

  


좀 더 구체적인 정보를 얻으려면 현재 실행중인 명령 주소(EIP)의 어셈블리 코드를 읽고 해석하여 ThreadFunc2 함수의 원본 소스코드 위치를 찾아내서 문제를 해결 할 수 있습니다하지만 매치하는 심볼을 가지고 있다면 EIP를 기준으로 소스 코드를 확인할 수 있습니다.

 

 

소스코드를 보니 CPU 사용률 52%의 원인이 확실해 집니다무한 루프를 도는 동작을 하고 있었습니다이렇게 WinDbg를 사용하면 정확한 소스 라인까지 찾을 수 있으므로 가장 확실한 문제 분석을 할 수 있습니다.