22

我有一个长期运行的 .NET 4.5 应用程序随机崩溃,并在事件日志中留下我在问题标题中提到的消息。该问题在 3 台不同的机器和 2 个不同的系统(2008 R2 和 2012)上重现。应用程序不使用任何不安全/非托管组件,它是纯托管的 .NET,唯一非托管的东西是 CLR 本身。

这是我从转储中提取的崩溃站点的堆栈跟踪:

clr.dll!MethodTable::GetCanonicalMethodTable()  
clr.dll!SVR::CFinalize::ScanForFinalization()  - 0x1a31b bytes  
clr.dll!SVR::gc_heap::mark_phase()  + 0x328 bytes   
clr.dll!SVR::gc_heap::gc1()  + 0x95 bytes   
clr.dll!SVR::gc_heap::garbage_collect()  + 0x16e bytes  
clr.dll!SVR::gc_heap::gc_thread_function()  + 0x3e bytes    
clr.dll!SVR::gc_heap::gc_thread_stub()  + 0x77 bytes    
kernel32.dll!BaseThreadInitThunk()  + 0x1a bytes    
ntdll.dll!RtlUserThreadStart()  + 0x21 bytes    

此问题与此处讨论的问题非常相似,因此我尝试了该主题中建议的解决方案,但都没有帮助:

  • 我已经尝试安装修补程序,但它不会安装在我的任何机器上(KB2640103 不适用,或者被您计算机上的其他条件阻止),这实际上是有道理的,因为我使用的是 4.5,而不是 4.0 .

  • 我尝试禁用并发 GC 和/或启用服务器 GC。现在我的 app.config 的相关部分如下所示:

    <?xml version="1.0"?>
    <configuration>        
        <runtime>
            <gcConcurrent enabled="false"/>
            <gcServer enabled="true" />
        </runtime>
    <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>    </startup></configuration>
    

虽然奇怪的是我仍然在进程转储中找到多个与 GC 相关的线程。除了发生崩溃的线程之外,还有 7 个线程具有以下堆栈跟踪:

ntdll.dll!NtWaitForSingleObject()  + 0xa bytes  
KERNELBASE.dll!WaitForSingleObjectEx()  + 0x9a bytes    
clr.dll!CLREventBase::WaitEx()  + 0x13f bytes   
clr.dll!CLREventBase::WaitEx()  + 0xf7 bytes    
clr.dll!CLREventBase::WaitEx()  + 0x78 bytes    
clr.dll!SVR::t_join::join()  + 0xd8 bytes   
clr.dll!SVR::gc_heap::scan_dependent_handles()  + 0x65 bytes    
clr.dll!SVR::gc_heap::mark_phase()  + 0x347 bytes   
clr.dll!SVR::gc_heap::gc1()  + 0x95 bytes   
clr.dll!SVR::gc_heap::garbage_collect()  + 0x16e bytes  
clr.dll!SVR::gc_heap::gc_thread_function()  + 0x3e bytes    
clr.dll!SVR::gc_heap::gc_thread_stub()  + 0x77 bytes    
kernel32.dll!BaseThreadInitThunk()  + 0x1a bytes    
ntdll.dll!RtlUserThreadStart()  + 0x21 bytes    

这让我想知道我是否可以以某种方式搞砸禁用并发 GC(这就是我实际列出的配置)。

我认为这总结了我迄今为止设法找到的内容。我真的可以使用一些帮助来处理这个问题。

4

7 回答 7

5

我借鉴了我过去在我们的应用程序中的经验。如果异常在 Finalizer 级别之前未处理,则可能会导致这种情况,如果它继续......它将使应用程序崩溃。

在对 GC 配置进行任何操作之前..

快速检查...您是否使用任务并行库如果是,请确保您正确处理异常。如果来自不同线程的异常没有得到处理,它将进入 Finalizer,然后使应用程序崩溃。有几种方法可以巧妙地处理它们。处理“聚合”异常是一种方法(我们曾经解决过!)。

http://msdn.microsoft.com/en-us/library/dd537614.aspx

我没有 50 分来添加评论,所以将其添加为答案...

于 2013-10-07T09:59:21.230 回答
1

我意识到这是一篇旧帖子,但是,我遇到了与 OP 相同的问题。atlaste提出的观点:

将运行时更改为 x86 或 x64 并重试;你也可以像你已经尝试过的那样弄乱并发 GC 设置。

对我来说是关键。我的所有项目都设置为任何 CPU,除了一个(巧合的是应用程序的入口点,它是控制台应用程序项目)。该项目设置为 x86。一旦我将其更改为任何 CPU,应用程序就会正确运行。

于 2016-05-10T19:08:28.133 回答
0

我终于找到了可以安装的修复程序。我也有 4.5 并且没有安装 4.0 的其他修复程序。删除 4.5 也没有修复它。修复链接实际上修复了它。

http://kb.machsol.com/Knowledgebase/Article/50305

于 2014-11-25T22:47:13.580 回答
0

我刚刚完成了与 Microsoft 的对话,因为我能够重现类似的问题。

就我而言,这是 .NET 运行时中的一个错误,它与混合动态类型和非动态代码有关。我不确定您的情况是否也是这种情况,但是您可能想尝试一些事情:

  • 在 Windows 8.1(最新更新)上运行代码。显然,Windows 8.1 的 .NET 版本比其他版本的 Windows 更新。
  • 如果您使用 AssemblyBuilder(像我一样),请尝试将其更改为Runmode 而不是RunAndCollect.
  • 将运行时更改为 x86 或 x64 并重试;你也可以像你已经尝试过的那样弄乱并发 GC 设置。
  • 正如我们所说,我的错误正在修复,这基本上意味着将有一个 Windows 更新来处理它。也许只是等待它也是一种选择;我不认为这需要太长时间,因为它对很多程序都非常关键。
于 2014-05-06T07:37:24.203 回答
0

帮助我的解决方案:卸载 .NET 4.5.1,安装 4.0,安装提到的修补程序,再安装 4.5.1。

于 2014-04-25T13:27:05.520 回答
0

我们在 .NET 4.5 桌面应用程序中遇到了同样的问题 - 网络爬虫。它在重载下随机坠毁。所以几个月来我们一直在寻找找出原因的方法:我们已经尝试了一切!禁用并发 GC,将其设置为服务器模式和许多其他解决方法,直到我们意识到由于PhantomJS模块而发生崩溃。它使用了一些非托管资源并且之后不会清除它们 :( 所以我们为 PhantomJS 集成创建了一个独立的控制台应用程序。现在我们使用Process.Start来自网络刮板的执行此控制台应用程序并在之后将其杀死。这需要更多时间刮擦,但不再崩溃!

于 2016-06-09T10:07:58.413 回答
0

我的问题很奇怪,每 5-10 分钟我的应用程序池就会因为这个退出代码 (80131506) 而崩溃。我不确定在高线程操作/计划任务中你应该推垃圾收集器,但以下解决方案适用于此。

我添加了一个每分钟调用 GC.GetTotalMemory(true) 的作业。我假设,出于某种原因,GC 并没有足够频繁地自动调用垃圾收集器来处理我使用的大量一次性对象。但这解决了我的问题!这更像是一个快速修复而不是最终解决方案;)

于 2018-08-23T17:24:17.070 回答