程序在 Windows 7 上启动但不执行任何操作

程序在 Windows 7 上启动但不执行任何操作

我们的一个用户正在尝试运行我们的(开源)软件在他工作时使用的 Windows 7 64 位机器上。

不幸的是,GUI 版本和命令行版本的程序都无法在他的机器上运行。程序似乎启动了,但什么也没做,GUI 版本甚至没有打开一个窗口。

我认为该进程实际上并没有走多远。以下是 Process Explorer 对他和我的机器上的进程线程的视图:

在他的 Windows 7 机器上:

Windows 7 上的进程线程

在我的 Windows 10 机器上:

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)

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 上很难说,因为获取参数并不容易。否则我们可以遍历等待链。

答案2

造成这一谜团的原因是Boost C++ 库以及Windows 7中的一些实现细节:

https://svn.boost.org/trac/boost/ticket/12475

我们应用程序的上一个版本 (1.4.0-beta) 使用的是 Boost 1.55,因此不受该错误的影响。最新版本使用的是 Boost 1.61,它存在该错误。

相关内容