Win32 프로덕션 프로세스에서 교착 상태로 인해 명백한 중단을 디버깅하는 단계와 기술은 무엇입니까? WinDbg를이 용도로 사용할 수 있다고 들었지만이를 달성 할 수있는 방법에 대한 명확한 힌트를 제공해 줄 수 있습니까?Win32 프로그램의 교착 상태 진단
답변
이 post는 다양한 options..Check에 태그 게시물을 시작할 수 있어야 디버깅 ..
debugging deadlocks에 또 다른 유용한 기사 ..
사용중인 언어/IDE는 무엇입니까?
닷넷에서당신은 응용 프로그램의 스레드를 볼 수 있습니다 Debug-> 윈도우 -> 스레드 또는 Ctrl + Alt + H를
디버깅 교착 상태가 까다로울 수 있습니다. 나는 보통 일종의 로깅을하고 로그가 멈추는 곳을 보았다. OutputDebugString()을 사용하여 파일이나 디버그 콘솔에 기록합니다.
소스 및 메모리 덤프 (또는 라이브 디버깅 세션)에 액세스 할 수 있으면 진정한 교착 상태를 디버깅하는 것은 실제로 쉽습니다.
스레드를보고 공유 자원 (예 : WaitForSingleObject
)을 기다리고있는 스레드를 찾으십시오. 일반적으로 거기에서 말하면 두 개 이상의 스레드가 서로 잠겨있는 것을 알아내는 문제입니다. 그러면 어느 것이 잠금 계층을 파손했는지 파악해야합니다.
잠긴 스레드를 쉽게 알아낼 수없는 경우 this post here에 표시된 방법을 사용하여 각 스레드의 잠금 체인을 추적하십시오. 루프에 들어가면 루프의 스레드가 교착 상태가됩니다.
가장 좋은 방법은 로깅 문을 추가하는 것입니다. 일반적으로 교착 상태에있는 공유 리소스에 대해서만 권장 할 것이지만 일반적으로 추가하는 것은 예상치 못한 상황이나 코드 영역을 가리킬 수도 있습니다. 많이 선전 된 stackoverflow.com 데이터베이스 문제는 실제로 log4net으로 밝혀졌습니다! stackoverflow 팀은 결코 log4net을 의심하지 않았으며, 로깅을 검사하여 (역설적으로)이 사실을 알 수있었습니다. 처음에는 복잡한 도구 (예 : WinDgb)를 사용하지 않았지만 매우 직관적 인 것은 아닙니다.
매우 게으른 경우 Application Verifier를 설치 한 다음 모듈을 추가하고 기본 테스트에서 "잠금"만 선택할 수 있습니다. 그러면 모든 디버거에서 응용 프로그램을 실행할 수 있습니다.
크리티컬 섹션 교착 상태가 발생하면 바로 원인을 찾아야합니다.