자신의 프로세스에서 스레드를 일시 중지하지 마세요!

2025-04-15
자신의 프로세스에서 스레드를 일시 중지하지 마세요!

한 고객이 오랫동안 지속되는 저빈도 멈춤 문제를 겪었습니다. UI 스레드가 커널을 호출한 후 아무런 이유 없이 멈췄습니다. 안타깝게도 커널 덤프에서는 스택이 페이지 아웃되었기 때문에 사용자 모드의 스택을 표시할 수 없었습니다. (멈춘 스레드는 스택을 사용하지 않으므로, 시스템이 메모리 부족 상태가 되면 스택이 페이지 아웃됩니다.) 조사 결과, 워치독 스레드가 UI 스레드를 주기적으로 일시 중지하여 스택 추적을 가져오고 있었지만, 이번에는 5시간 이상 멈췄습니다. 원인은 데드락이었습니다. 워치독 스레드는 UI 스레드의 스택 추적을 가져오려고 했지만, 함수 테이블 잠금이 필요했습니다. 그러나 UI 스레드는 일시 중지되어 있었고, 해당 잠금을 보유하고 있었습니다. 이 문서에서는 자체 프로세스에서 스레드를 일시 중지하지 않도록 강조합니다. 리소스 충돌로 인해 데드락이 발생할 위험이 있기 때문입니다. 스레드를 일시 중지하고 스택 추적을 가져와야 하는 경우, 데드락을 방지하기 위해 다른 프로세스에서 실행해야 합니다.