小编Hel*_*ick的帖子

.NET 4.5:.NET运行时中的内部错误(80131506)/禁用并发GC

我有一个长期运行的.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    
Run Code Online (Sandbox Code Playgroud)

这个问题与这里讨论的问题非常相似,所以我尝试了该主题中提出的解决方案,但没有一个帮助:

  • 我已经尝试安装修补程序,但它不会安装在我的任何机器上(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>
    
    Run Code Online (Sandbox Code Playgroud)

虽然奇怪的是我仍然在进程转储中找到多个与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 …
Run Code Online (Sandbox Code Playgroud)

.net c# clr garbage-collection .net-4.5

22
推荐指数
1
解决办法
2万
查看次数

为什么为匿名类生成的GetHashCode()实现中的初始哈希值取决于属性名称?

GetHashCode()为匿名类生成实现时,Roslyn根据属性名称计算初始哈希值.例如,为其生成的类

var x = new { Int = 42, Text = "42" };
Run Code Online (Sandbox Code Playgroud)

将有以下GetHashCode()方法:

public override in GetHashCode()
{
   int hash = 339055328;
   hash = hash * -1521134295 + EqualityComparer<int>.Default.GetHashCode( Int );
   hash = hash * -1521134295 + EqualityComparer<string>.Default.GetHashCode( Text );
   return hash;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我们更改属性名称,则初始值会更改:

var x = new { Int2 = 42, Text2 = "42" };

public override in GetHashCode()
{
   int hash = 605502342;
   hash = hash * -1521134295 + EqualityComparer<int>.Default.GetHashCode( Int2 );
   hash …
Run Code Online (Sandbox Code Playgroud)

c# roslyn

5
推荐指数
1
解决办法
431
查看次数

标签 统计

c# ×2

.net ×1

.net-4.5 ×1

clr ×1

garbage-collection ×1

roslyn ×1