■ jwFreeNote_01
XP에서 VC6(가끔은 2003,2005)를 써서 멀티쓰레드 프로그램을 디버그 하는 중에 hang 된다는 얘기를 종종 들을 수 있다. 이건 CTFMON.EXE의 문제이고 고급 텍스트 서비스를 끄면 대부분 해결된다. 나는 여태까지 이렇게만 알고 있었는데, 이번에 더 상세하게 이 문제를 파헤쳐 놓은 사람의 글을 발견해서 이 링크를 올린다. http://www.virtualdub.org/blog/pivot/entry.php?id=118 요컨데(제대로 해석했는지 모르겠지만 ^^) "CTF.LBES.MutexDefaultS-1-5-21-790525478-1715562821-839522115-1003 " 와 비슷한 이름의 Mutex가 텍스트 서비스 프레임워크(Office와 XP) 에 존재하는데, 텍스트를 찍는데에 있어 이 뮤텍스가 필요한 모양이다. 그런데 어느 순간 디버그 당하는 프로세스의 어떤 쓰레드가 화면에 텍스트를 찍기 위해 이 뮤텍스를 소유하고, 다른 쓰레드들 또한 이 뮤텍스의 소유권을 얻기 위해 기다리는 경우가 발생할 수 있다. 이 때 VC 디버거에서 이 뮤텍스를 소유하려고 달려들면(예를 들면 소스를 찍으려고...) 당연히 이것도 기다리게 되므로 결국 hang이 되버린다. 그런데 hang이 왜 풀리지 않는가 하면 디버거가 쓰레드를 다 잡고 있기 때문이다. 그럼 뮤텍스를 릴리즈 않게 되는 것이니 hang이 되는 것이다. 결국 데드락이다. 이러다보면 차례차례 거의 모든 프로세스가 이 뮤텍스 하나에 다 매달리는 문제가 생기고 결국 시스템 자체가 hang 되는 경우가 발생한다. 단 커맨드 프롬프트(콘솔창)에 경우에는 완전히 다른 체계(csrss.exe)를 쓰므로 문제가 발생하지 않는데, 그래서 그런지 예전에 이런 문제가 발생했을 때 콘솔창을 띄어서 문제생기면 재빠르게 Alt-Tab 으로 전환해서 킬시키면 이상하게 문제없었던 기억이 있는데 이런 상황 때문이었던 거 같다. 결론은 이런데 그 외에도 상황이 좀 있다. 이거에 대해서는 자세하게 링크에서 읽어보시고, 그 설명의 결론은 Disable Text Services Framework in Regional and Language Settings 이거란다. ^^: 댓글에도 적혀있지만 전역 뮤텍스로 저렇게 중요한 거를 제어하는건 정말 위험한 생각이다 ㅡㅡ; 특히나 UI를 저런식으로는 좀... 글고 댓글 보니 이 외에도 SendMessage( HWMD_TOPMOST ) 이거를 보내면 비슷한 상황이 있나보다. 아직 저걸 쓸 일이 없어서 이 상황을 겪어보진 못했지만 조심해야 겠다. 뭐 여튼 예전에 어렴풋이 MS 기술문서에서도 본 거 같은데 찾을 수 없어 뒤지다 발견했는데, 의외로 수확이다. 앞으로 좋은 참고가 될 듯 싶다. |
댓글
댓글 쓰기