我尝试从 Windows 开始菜单照常启动应用程序。经过约 30 分钟,我得到了以下效果:
- 带有 GUI 的应用程序不再显示。
- 我可以继续使用已经打开的 GUI 应用程序
- 我可以打开非 GUI/控制台应用程序(如
cmd
)。 - 从命令行提示符中,我可以看到 GUI 应用程序已使用以下方式启动
tasklist
以下是一个例子:
>tasklist | find "taskmgr"
taskmgr.exe 4352 Console 1 7.216 K
taskmgr.exe 7824 Console 1 7.216 K
taskmgr.exe 7232 Console 1 7.232 K
可以想象,我尝试启动任务管理器来诊断问题 3 次。但没有任务管理器窗口显示出来。
假设按照tasklist
启动顺序显示进程,我粗略地确定了问题所在:
...
openAgent.exe 7012 Console 1 592.440 K Not Responding
...
WerFault.exe 3592 Console 1 10.112 K Unknown
...
openAgent
是我关闭的应用程序(或至少尝试关闭,因为它似乎仍在运行)。一定是由于 的存在导致某些程序崩溃WerFault
,但我没有看到 Windows 错误报告对话框。
openAgent
使用强制终止应用程序后taskkill /pid 7012 /f
,我尝试启动的所有应用程序突然出现。
现在查看 Windows 错误报告对话框,它显示异常80000003
,这是一个(调试)断点。
这里发生了什么?我想从 Windows 内部的角度了解情况。理论上我希望用户模式应用程序的崩溃不会影响其他应用程序。
不幸的是,我既没有该情况的内核转储,也没有该情况的用户模式崩溃转储openAgent
,所以这就是我能给你的所有信息。
我的系统是 Windows 7 SP1 x64 Enterprise,没有待处理的 Windows 更新,Intel Core i7 CPU。openAgent
是测试自动化工具 MicroFocus 的 SilkTest 的可执行文件。
答案1
我可以再次重现该问题,结果发现安装了一个名为“同一家公司”的openAgent
钩子。OsHookDll_x86
此钩子适用于DispatchHookW()
:
2:010> k
...
0049f2b0 75a86381 OsHookDll_x86!GetMessageHook+0x37
0049f2cc 75a780a9 USER32!DispatchHookW+0x38
...
0049f544 5eff5709 USER32!PeekMessageW+0x108
这会影响 Windows 消息循环。任何 GUI 应用程序运行时都需要 Windows 消息循环。
该钩子将 Windows 消息发送到openAgent
via USER32!SendMessageW()
,但openAgent
被 Windows 错误报告 ( WerFault
) 暂停,因此无法处理此类消息,从而导致超时:
1:009> k
ChildEBP RetAddr
00138f90 75a79886 USER32!NtUserMessageCall+0x15
00138fcc 75a797f3 USER32!SendMessageTimeoutWorker+0xa6
00138ff4 59d6066c USER32!SendMessageTimeoutW+0x21
...
我无法完全分析其余部分,因为在我的调试会话期间,其他一切也开始冻结。我假设钩子试图重新发送消息而不是返回,从而导致无限循环。
!analyze -v
由于缺少符号ntdll
。