C# 警告:此地址有多个托管方法

C# 警告:此地址有多个托管方法,c#,debugging,windbg,sosex,C#,Debugging,Windbg,Sosex,我遇到了一个C#应用程序的问题,它可以在没有警告或有意义的信息的情况下随机崩溃。相同的数据可以通过应用程序输入,但它不会同时崩溃,有时甚至不会崩溃 我已经使用WinDbg获取了一些有关异常的信息。有一个NullReferenceException与一个访问冲突错误一起抛出 使用SOSEX,我得到了一个使用的堆栈!mk。我有一个顶部有以下内容的堆栈: 03:M 000000001aefd4f8 000007fef94cfa70 System.Runtime.Remoting.SoapService

我遇到了一个C#应用程序的问题,它可以在没有警告或有意义的信息的情况下随机崩溃。相同的数据可以通过应用程序输入,但它不会同时崩溃,有时甚至不会崩溃

我已经使用WinDbg获取了一些有关异常的信息。有一个
NullReferenceException
与一个
访问冲突
错误一起抛出

使用SOSEX,我得到了一个使用
的堆栈!mk
。我有一个顶部有以下内容的堆栈:

03:M 000000001aefd4f8 000007fef94cfa70 System.Runtime.Remoting.SoapServices.GetXmlTypeForInteropType(System.Type, System.String ByRef, System.String ByRef)(+0x0 IL,+0xd9e9a0 Native)
04:M 000000001aefd4f8 000007fef94cfa6f System.Runtime.Remoting.Metadata.RemotingTypeCachedData.get_QualifiedTypeName()(+0x0 IL,+0xd9ea5f Native)
05:U 000000001aefd500 000007fef991339b clr!CopyValueClassUnchecked+0xb8
06:U 000000001aefd550 000007fef9902491 clr!JIT_BoxFastMPIGT__PatchTLSLabel+0x51
[WARNING: Multiple managed methods at this address]07:M 000000001aefd580 000007fef87350ad System.Collections.Generic.List`1[[System.__Canon, mscorlib]].System.Collections.Generic.IEnumerable<T>.GetEnumerator()(+0x0 IL,+0xff47bced Native)
[WARNING: Multiple managed methods at this address]08:M 000000001aefd5d0 000007fef6d60e4f System.Linq.Enumerable.FirstOrDefault[[System.__Canon, mscorlib]](System.Collections.Generic.IEnumerable`1<System.__Canon>, System.Func`2<System.__Canon,Boolean>)(+0x22 IL,+0x5f Native)
09:M 000000001aefd630 000007fe9a7885d8 Settings.VersionedSettings.GetSetting(System.DateTimeOffset, System.Guid)(+0x4e IL,+0x258 Native)
03:M 00000000 1AEFD4F8 000007fef94cfa70系统运行时远程处理SoapServices GetXmlTypeForInteropType(System.Type,System.String ByRef,System.String ByRef)(+0x0 IL,+0xd9e9a0本机)
04:M 00000000 1AEFD4F8 000007fef94cfa6f System.Runtime.Remoting.Metadata.RemotingTypeCachedData.get_QualifiedTypeName()(+0x0 IL,+0xd9ea5f Native)
05:U 00000000 1EFD500 000007 FEF991339B clr!CopyValueClassUnchecked+0xb8
06:U 00000000 1AEFD550000007 FEF9902491 clr!JIT_-BoxFastMPIGT__-PatchTLSLabel+0x51
[警告:此地址有多个托管方法]07:M 00000000 1AEFD580000007FEF87350AD System.Collections.Generic.List`1[[System.\uu Canon,mscorlib]].System.Collections.Generic.IEnumerable.GetEnumerator()(+0x0 IL,+0xff47bced Native)
[警告:此地址有多个托管方法]08:M 00000000 1AEFD5D0000007FEF6D60E4F System.Linq.Enumerable.FirstOrDefault[[System.\uu Canon,mscorlib]](System.Collections.Generic.IEnumerable`1,System.Func`2)(+0x22 IL,+0x5f Native)
09:M 00000000 1AEFD630 00000 7FE9A7885D8设置.VersionedSettings.GetSetting(System.DateTimeOffset,System.Guid)(+0x4e IL,+0x258本机)
[警告:此地址有多个托管方法]
开头的行似乎特别令人担忧-这意味着什么

从堆栈的底部往上看,在这一点之前,一切看起来都正常。然后,对
IEnumerable.FirstOrDefault
的随机方法调用会将其抛出。
VersionedSettings.GetSetting(…)
方法不进行此类调用。这就是为什么我有点困惑

编辑:我已经运行了
!在WinDbg中验证堆
,输出为“未检测到堆损坏”。我对WinDbg的了解有限,所以我不确定这个命令有多准确,但我认为它值得添加


有人知道发生了什么吗?

您的应用程序是否使用过
不安全的
代码?看起来您有一些堆栈损坏。此外,我设想“此地址的多个托管方法”在某种程度上意味着多个函数映射到一个地址;这可能就是调用错误方法的原因。如果您有这个源,您可能需要对所有库进行完全的重建,并确保所有的版本和WHO都不正确。用托管C++,用标记为托管的本机地址的本机函数也将具有托管函数地址。或者类似的。这被称为双重重击。但你不应该让这种事在C#发生。这肯定是某种堆栈损坏。您是否将托管库作为依赖项?还是p/invoke?托管C++项目用不同的CLR本地支持选项编译…也许这是为类似的本机/托管CLR而编译的,而不是纯托管运行时?DAC提供了一个方法枚举器,它将指令指针作为参数。虽然我可以推测,但我从来没有确切理解这意味着什么。sosex中的消息意味着sosex枚举了地址处的方法,并发现多个方法共享同一代码。我会看看这周是否能再深入一点,找出造成这种情况的原因。sosex处理这种情况的方式是“最后一个赢”。也许把它改成“第一个赢”会更好。如果你能提供一份复印件,它将帮助我诊断。谢谢你的回复。我看了一下,确保代码库中没有不安全的代码。我们进行了多次重建,版本号看起来都是正确的。@Greg你所说的托管库是什么意思?我们在C#中开发了很多依赖项。我还没有看过p/invoke的编译输出,但如果有,我会感到惊讶。不幸的是,我真的不能提供一个复制;该问题仅在18台服务器上发生(尽管在这种情况下,每次运行一台服务器通常会停机)。另外,它只在高负载下出现。