从用户空间冻结窗口的方法

时间:2011-07-30 09:13:46

标签: windows

我正在调查一个导致Windows冻结的错误。发生错误后,当前正在运行的所有进程将继续运行,但如果您尝试使用它们,它们最终会冻结。

例如,我有一个任务管理器,并在冻结时打开几个cmd。任务管理器运行良好,显示处理器/内存使用情况,所有进程列表等。但如果我试图杀死一个进程,它会冻结。如果我试图打开文件 - >新任务会冻结。在cmd中,如果我尝试打开W​​indows应用程序,该命令将执行,新进程将出现在任务管理器中,但应用程序将无法启动。即使启动命令行应用程序也会冻结。

所讨论的软件是一组12个使用WCF相互通信的各种服务应用程序。大多数是用C#编写的,有一些Fortran,C ++。所有这些都在运行用户空间,我们在内核空间中没有任何执行。

所以我的问题是有没有人看过这个或类似的行为?原因是什么?理论上,用户空间应用程序不应该冻结整个操作系统吗?有关调试此情况的任何提示也会有所帮助。谢谢你的时间。

更新1:

我们尝试编写一个小应用程序,它不断地从磁盘写入/读取(随机搜索和打开/关闭文件)并在系统冻结之前启动。应用程序在冻结后继续成功写入/读取打开和关闭文件。内存使用情况与正常使用情况相同,在4到5 GB之间,系统有6GB。

我们还做了一次内存转储,麻烦的是我们未能弄清楚发生了什么。转储当然表明Windows已经冻结在键盘驱动程序中,但除此之外,我们无法想象太多。如果我们可以进行用户空间内存转储会更有用。好吧这句话让我对谷歌有点了,看来有一个完整的内存转储选项,会对此进行更多研究并更新进度。

我们目前的嫌疑人是NOD32防火墙,当它关闭时,一切似乎都正常。我们仍然需要确认这一点,并找出我们的代码中引发此行为的原因。

感谢大家的帮助。

更新2:

好的,我已经设法创建了完整的内存转储。这并不像我希望的那么容易,这里有一些有用的资源,也许有一天他们会帮助别人..:

http://www.osronline.com/article.cfm?article=545

http://blogs.msdn.com/b/ntdebugging/archive/2010/04/02/how-to-use-the-dedicateddumpfile-registry-value-to-overcome-space-limitations-on-the-system-drive-when-capturing-a-system-memory-dump.aspx

一旦系统冻结,我启动了一个cmd.exe并启动了复制命令,cmd冻结了,这是它的堆栈跟踪:

    fffff880`087571d0 fffff800`02cc2992 nt!KiSwapContext+0x7a
    fffff880`08757310 fffff800`02cc4d0f nt!KiCommitThreadWait+0x1d2
    fffff880`087573a0 fffff800`02cd9d1f nt!KeWaitForSingleObject+0x19f
    fffff880`08757440 fffff800`02fc06d6 nt!AlpcpSignalAndWait+0x8f
    fffff880`087574f0 fffff800`02fbe660 nt!AlpcpReceiveSynchronousReply+0x46
    fffff880`08757550 fffff800`02fcd13d nt!AlpcpProcessSynchronousRequest+0x33d
    fffff880`08757670 fffff800`030ade59 nt!LpcpRequestWaitReplyPort+0x9c
    fffff880`087576d0 fffff880`05ad1344 nt!LpcRequestWaitReplyPort+0x19
    fffff880`08757710 fffff880`05ad430f eamon+0x5344
    fffff880`087578d0 fffff880`05ad25bb eamon+0x830f
    fffff880`08757970 fffff800`02fd075f eamon+0x65bb
    fffff880`087579f0 fffff800`02fb6624 nt!IopCloseFile+0x11f
    fffff880`08757a80 fffff800`02fd0251 nt!ObpDecrementHandleCount+0xb4
    fffff880`08757b00 fffff800`02fd0164 nt!ObpCloseHandleTableEntry+0xb1
    fffff880`08757b90 fffff800`02cba953 nt!ObpCloseHandle+0x94
    fffff880`08757be0 00000000`77bff7aa nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ fffff880`08757be0)
    00000000`002fd848 00000000`00000000 ntdll!ZwClose+0xa

更新3:

经过一些广泛的测试后,我们得出结论,该问题与ESET NOD32 Antivirus有关。感谢大家的帮助和提供的信息。

6 个答案:

答案 0 :(得分:3)

不确定可能的原因,但在我看来,最好的方法是在冻结期间生成完整的内存转储,并使用WinDbg寻找线索。请参阅here如何使用键盘创建BSOD。

答案 1 :(得分:3)

由于冻结是由未完成的I / O引起的,因此问题可能是某些驱动程序。

我会从您收集的内核内存转储中的!analyze开始。在许多情况下,它可以立即查明问题,或提供在哪里寻找的线索。

如果!analyze没有报告任何有用的内容,那么您可以通过查看停滞线程的IRP来尝试获取有关冻结中涉及的驱动程序的更多信息。

  1. 在停滞的线程中查找IRP列表。未完成的IRP列表显示在!thread输出中。
  2. 使用!irp命令转发IRP。
  3. IRP可能看起来像这样:

    kd> !irp 8420d320
    Irp is active with 4 stacks 2 is current (= 0x8420d3b4)
     No Mdl: No System Buffer: Thread 8426b420:  Irp stack trace.  
         cmd  flg cl Device   File     Completion-Context
     [  0, 0]   0  0 00000000 00000000 00000000-00000000    
    
                Args: 00000000 00000000 00000000 00000000
    >[  0, 0]   0 e0 84d1e878 84275bd0 86be23be-83bb1908 Success Error Cancel 
               \FileSystem\mrxsmb   mup!MupiUncProviderCompletion
                Args: 88795aac 01220044 00050000 00000000
     [  0, 0]   0 e0 84723700 84275bd0 863bf4de-84bc9228 Success Error Cancel 
               \FileSystem\Mup  fltmgr!FltpSynchronizedOperationCompletion
                Args: 88795aac 01220044 00050000 00000000
     [  0, 0]   0  0 847231f0 84275bd0 00000000-00000000    
               \FileSystem\FltMgr
                Args: 88795aac 01220044 00050000 00000000

    IPR中的活动堆栈标有>。在上面的示例中,它正在等待\ FileSystem \ mrxsmb设备。

    为了使调查更容易,请花些时间为机器配置内核调试程序。这是可选的,但它比处理内存转储更容易。

答案 2 :(得分:2)

从堆栈转储中,“eamon.sys”驱动程序似乎正处于战斗中。就像你说的,这个驱动程序与ESET的NOD32 Antivirus有关。

如果你添加这个事实,你说没有它就一切正常,那么你应该停止你的研究。根据定义,防病毒软件包作为驱动程序安装,因此他们可以高效地完成工作。这样做的缺点是当它们出现问题时,就意味着它们可以轻易地完全占用机器或导致BSOD。

谷歌搜索了一些关于这个特定软件的其他类似报道(http://www.wilderssecurity.com/archive/index.php/t-259245.html)。

您应该与供应商联系,看看它是否正常,或者是否有更新或解决方法。

答案 3 :(得分:1)

听起来好像在等待未及时完成的​​磁盘I / O请求。

您有一个I / O错误(总线断开连接,类似的事情)或一个过长的磁盘请求队列导致大量搜索。页面文件的使用会导致这种情况。

任务管理器显示内存利用率是什么?

答案 4 :(得分:1)

您已加载Windows符号(正常),并且发现问题很可能位于eamon.sys驱动程序中。一点点Google搜索引导我this看起来像病毒扫描程序。如果我是你,我会将此转储报告给病毒扫描程序软件人员并询问他们是否已经搞砸了。

病毒扫描程序是此类系统崩溃的主要来源之一。它们与操作系统进行如此深入的交互,以至于在不同时间出现细微错误的特定硬件配置上,事情可能会出现问题。

答案 5 :(得分:0)

我会查看以下内容:

  1. 冻结时,CPU使用情况如何?它是否被任何过程完全占用?
  2. 您遇到此问题的操作系统?是vista还是win7?您的服务是否具有执行特定操作的适当权限?
  3. 由于您提到了防火墙,因此启用防火墙日志可能是有意义的,并查看日志中发生冻结时是否发生了任何事情。防火墙是否试图阻止某些事情?您的服务是否在不断尝试配置/获取它?
  4. 是否可以启用服务登录并缩小案例范围?它可能会显示何时导致系统冻结,然后您可能会注意到它执行的特定操作导致了这种情况。
  5. 希望这有帮助。