훈, IT 공부/Debug

Windbg Dump 분석 / Deadlock 찾아내는 법

IT훈이 2022. 7. 13.
반응형

Windbg Dump 분석 / Deadlock 찾아내는 법

 

Windows환경에서 멀티스레딩 프로세스를 사용하다보면

Hang이 걸리는 현상이 발생합니다

그럴때 가장먼저 의심해봐야하는 사항이 

프로세스가 Deadlock에 걸린것인지에 대한 확인입니다

 

안녕하세요 IT훈이입니다 ❤️

 

 

lock 명령어 사용법

우선 hang이 걸린 dump파일을 open하고, 

CommandLine에서 !lock 명령어를 입력해줍니다.

0:000>!locks

 

 

lock 출력 파라미터 뜻

✔️ LockCount : critical section으로 진입하기 위한 EnterCriticalSection()을 호출한 thread의 수에서 하나를 뺀 것과 같습니다. -1을 하는 이유는 이 필드는 -1을 unlock 상태로 표시하고 EnterCriticalSection()이 호출될 때마다, 하나씩 증가하기 때문입니다. 그리고 나중에 LeaveCriticalSection()이 호출되면 하나씩 감소시키게 됩니다.

 예를 들어, 만약 LockCount 값이 3이라면 하나의 thread는 이 critical section에 진입한 상태이고, 3개의 다른 thread들이 이 곳에 진입하기 위해서 기회를 노리고 있다는 의미로 해석할 수 있습니다.

✔️Owning thread : 말 그대로 이 critical section 객체를 현재 가지고 있는  thread이다. 

✔️RecursionCount : critical section에 진입한 thread가 다시 EnterCriticalSection()을 몇 번 더 호출하고 있는지를 나타낸다.

✔️ EntryCount : critical section에 진입하지 못한 thread가 몇 번이나 EnterCriticalSection()을 호출하고 있는지를 나타낸다.

✔️ CritSec +82a002c0 at 0000021082a002c0 에서 at 다음에 있는 숫자는 critical section의 핸들이다.

 

 

* Deadlock에 빠진 것이라면, !locks 명령어를 실행했을 때, LockCount가 1 이상인 것들이 하나 이상 존재해야합니다.

 

 

 LockCount가 1 이상일경우, 이 쓰레드들의 콜스텍을( ~*kbn명령 ) 훑어보게되면 원인을 유추해볼 수 있습니다. 콜스텍 의 마지막 호출 부분을 보게되면, ntdll!RtlpWaitForCriticalSection와 같은 콜스텍 존재하는데, 이 함수의 첫번째 인자가 그 쓰레드가 지금 기다리고 있는 critical section의 핸들이라는 것입니다. 이 핸들을 !locks으로 출력됐던 결과에서 봤을 때, critical section을 가지고 있는 두 놈이 서로의 것을 기다리고 있다면, 이것이 바로 Deadlock의 원인입니다.

 

 

명령어 옵션

✔️ !locks : section 객체만을 보여줍니다.

✔️ !locks -v : 프로세스 밖에 있는 critical section 객체도 보여줍니다.

✔️ !locks -o : Windows XP와 그 이후의 운영체제만 지원하는 것으로 orphaned information(유효하지 않은 critical section을 가르키고 있는 포인터)만을 보여줍니다.

 

locks 명령 말고도 비슷한 모양으로 정보를 보여주는 명령어는 !critecs, !cs 등이 있습니다.

 

 

https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/-locks---kdext--locks-

 

locks kdext - Windows drivers

The locks extension in Kdextx86.dll and Kdexts.dll displays information about kernel ERESOURCE locks.

docs.microsoft.com

 


2022.07.21 - [훈개발/Window] - Windbg Dump 분석 / 메모리 확인하는 법 dps dds dqs !teb

 

Windbg Dump 분석 / 메모리 확인하는 법 dps dds dqs !teb

Windbg Dump 분석 / 메모리 확인하는 법 dps dds dqs !teb dps, dds, dqs란? 기본적으로 dds, dps, dqs 명령은 프로세스에서 지정된 범위의 메모리 내용을 표시합니다. 알아보신분들을 이미 해당 명령어는 d*s..

master-hun.tistory.com

2022.06.24 - [훈개발/Python] - [Python] 웹크롤링 Selenium 과 ChromeDriver 사용법, 설치방법 총정리

 

[Python] 웹크롤링 Selenium 과 ChromeDriver 사용법, 설치방법 총정리

웹크롤링 Selenium 과 ChromeDriver 사용법, 설치방법 총정리 파이썬으로 웹크롤러를 만들기위해서 Selenium과 ChromeDriver 패키지들이 필요합니다. 필요한 파이썬 패키지 설치하는 방법에대해서 포스

master-hun.tistory.com

2022.06.22 - [훈개발/C#] - C#, ChromeDriver 활용한 크롤링 자동화처리 네이버 웹툰 리스트 불러오기

 

C#, ChromeDriver 활용한 크롤링 자동화처리 네이버 웹툰 리스트 불러오기

C#, ChromeDriver 활용한 크롤링 자동화처리 네이버 웹툰 리스트 불러오기 자동화 툴 개발을 위하여 이것저것 만들어보면서 기능을 익히고 있습니다. 그 과정에서 나온 '웹툰리스트 불러오기'

master-hun.tistory.com

 

반응형

댓글