我们的一个用户正在尝试运行我们的(开源)软件在他工作时使用的 Windows 7 64 位机器上。
不幸的是,GUI 版本和命令行版本的程序都无法在他的机器上运行。程序似乎启动了,但什么也没做,GUI 版本甚至没有打开一个窗口。
我认为该进程实际上并没有走多远。以下是 Process Explorer 对他和我的机器上的进程线程的视图:
在他的 Windows 7 机器上:
在我的 Windows 10 机器上:
我们的软件是使用 64 位模式的 Visual Studio 2013 构建的。包含 MSVC 运行时。它已经运行多年,可能在各种机器上都运行过。
可能发生什么事?
我很高兴添加所需的详细信息。
更新 1:我有两台机器的 Process Monitor 跟踪(*.pml 文件),但尽管我知道如何解释它们,但我不确定我能从中得出什么结论。有人有兴趣看看吗?我有点犹豫是否要在这里发布它们,因为我怀疑它们可能包含敏感信息。
更新 2:该问题在我们访问的所有 Windows 7 机器上均可重现,但在其他 Windows 版本上则不会重现。
更新 3:先前版本据报道,该应用程序在 Windows 7 上运行良好,而最新发布没有。我们构建或打包应用程序的方式没有任何改变。
答案1
这是我在 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)
这确实在程序启动过程的早期发生。
在调用堆栈上我看到
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 上很难说,因为获取参数并不容易。否则我们可以遍历等待链。
答案2
造成这一谜团的原因是Boost C++ 库以及Windows 7中的一些实现细节:
https://svn.boost.org/trac/boost/ticket/12475
我们应用程序的上一个版本 (1.4.0-beta) 使用的是 Boost 1.55,因此不受该错误的影响。最新版本使用的是 Boost 1.61,它存在该错误。