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-
2022.07.21 - [훈개발/Window] - Windbg Dump 분석 / 메모리 확인하는 법 dps dds dqs !teb
2022.06.24 - [훈개발/Python] - [Python] 웹크롤링 Selenium 과 ChromeDriver 사용법, 설치방법 총정리
2022.06.22 - [훈개발/C#] - C#, ChromeDriver 활용한 크롤링 자동화처리 네이버 웹툰 리스트 불러오기
'훈, IT 공부 > Debug' 카테고리의 다른 글
Windbg Dump 분석 / 메모리 확인하는 법 dps dds dqs !teb (0) | 2022.07.21 |
---|
댓글