사용자 중 한 명이 자신의 작업에서 Windows 7 64 비트 컴퓨터에서 (오픈 소스) 소프트웨어 를 실행하려고합니다 .
불행하게도, GUI 버전이나 프로그램의 명령 행 버전은 그의 머신에서 실행되지 않습니다. 프로그램이 시작된 것처럼 보이지만 아무것도하지 않으며 GUI 버전도 창을 열지 않습니다.
나는 그 과정이 실제로 너무 멀리 가고 있다고 생각하지 않습니다. 다음은 자신과 내 컴퓨터의 프로세스 스레드에 대한 프로세스 탐색기보기입니다.
그의 Windows 7 컴퓨터에서 :
내 Windows 10 컴퓨터에서 :
우리의 소프트웨어는 Visual Studio 2013을 64 비트 모드로 구축했습니다. MSVC 런타임이 포함되어 있습니다. 아마도 여러 기계에서 수년 동안 노력해 왔습니다.
무슨 일이야?
필요한 세부 정보를 추가하게되어 기쁘게 생각합니다.
업데이트 1 : 두 시스템에 대한 프로세스 모니터 추적 (* .pml 파일)이 있지만 해석 방법을 알고 있지만 어떤 결론을 얻을 수 있는지 잘 모르겠습니다. 살펴보고 싶은 사람? 민감한 정보가 포함되어 있다고 생각되면 여기에 게시하는 것이 주저합니다.
업데이트 2 :이 문제는 액세스 권한이있는 모든 Windows 7 컴퓨터에서 재현 할 수 있지만 다른 Windows 버전에서는 재현 할 수 없습니다.
업데이트 3 : 이전 릴리스 의 응용 프로그램은 Windows 7에서 제대로 작동하는 것으로보고되었지만 최신 릴리스 는 그렇지 않습니다. 애플리케이션을 빌드하거나 패키징하는 방식에는 변화가 없습니다.
답변
다음은 Microsoft WinDbg 디버거에서 실행할 때의 출력입니다.
Break-in sent, waiting 30 seconds...
WARNING: Break-in timed out, suspending.
This is usually caused by another thread holding the loader lock
(36a4.2fc8): Wake debugger - code 80000007 (first chance)
로더 잠금이 무엇인지 StackOverflow를 참조하십시오 .
이것은 실제로 프로그램의 시작 절차에서 매우 일찍 발생합니다.
콜 스택에서
0:000> k
# Child-SP RetAddr Call Site
00 00000000`0020e9f8 00000000`771eaa78 ntdll!ZwWaitForKeyedEvent+0xa
01 00000000`0020ea00 00000000`771eabe2 ntdll!TppWaitpSet+0x1f1
02 00000000`0020eaa0 00000000`771ed0c4 ntdll!TppSetWaitInterrupt+0xa2
03 00000000`0020eb90 00000000`770bee49 ntdll!RtlRegisterWait+0x1e4
04 00000000`0020ec60 000007fe`d7252e98 kernel32!RegisterWaitForSingleObject+0x59
[...]
MSVCR120!Concurrency::critical_section::lock+0x2a [f:\dd\vctools\crt\crtw32\concrt\rtlocks.cpp @ 1031]
[...]
17 00000000`0020f790 00000000`00000000 ntdll!LdrInitializeThunk+0xe
따라서 교착 상태 일 수는 있지만 교착 상태 일 수는 없습니다. 스레드가 이전에 중요한 섹션을 잠그고 이제 다른 것을 기다리고 있습니다. 인수를 얻는 것이 쉽지 않기 때문에 x64에서는 말하기가 어렵습니다. 그렇지 않으면 대기 체인을 통과 할 수 있습니다.
답변
이 미스터리의 원인은 Boost C ++ Libraries 1.61 버전의 실제 버그 와 Windows 7의 일부 구현 세부 사항 의 조합으로 밝혀졌습니다 .
https://svn.boost.org/trac/boost/ticket/12475
이전 버전의 응용 프로그램 (1.4.0- 베타)은 Boost 1.55를 사용하고 있으며 버그의 영향을받지 않습니다. 최신 릴리스는 버그가있는 Boost 1.61을 사용하고 있습니다.