单声道内存管理错误?

时间:2017-06-25 19:08:52

标签: memory-management mono nullreferenceexception

我有一个用C#/ .NET 4.5.2开发的程序,在Windows(7 x64)上运行良好。该程序处理大量数据,因此仅针对x64进行编译。我最大的输入数据集可以在具有16GB RAM的PC上处理。

当我尝试在Ubuntu 16.04 LTS 64位上运行它时;安装了64 GB RAM,一切都适用于较小的数据集,但我开始使用更大的数据集获取SIGSEGV信号。这些错误并不总是发生在同一个位置,对于中等大小的数据集,它们有时根本不会发生。

我升级了我的Mono版本,所以我现在正在运行5.0.1.1:

TLS:__thread
SIGSEGV:altstack
通知:epoll
建筑:amd64
残疾人:没有 杂项:softdebug
LLVM:支持,未启用。
GC:sgen(默认并发)

升级用NullReferenceException替换了错误:

原生堆栈跟踪:

Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object
  at (wrapper managed-to-native) System.Array:FastCopy (System.Array,int,System.Array,int,int)
  at System.Array.Copy (System.Array sourceArray, System.Int32 sourceIndex, System.Array destinationArray, System.Int32 destinationIndex, System.Int32 length) [0x00068] in <a07d6bf484a54da2861691df910339b1>:0 
  at System.Collections.Generic.HashSet`1[T].SetCapacity (System.Int32 newSize, System.Boolean forceNewHashCodes) [0x0000f] in <26aedeede9534b948c539f8734c8492d>:0 
  at System.Collections.Generic.HashSet`1[T].IncreaseCapacity () [0x00025] in <26aedeede9534b948c539f8734c8492d>:0 
  at System.Collections.Generic.HashSet`1[T].AddIfNotPresent (T value) [0x000bc] in <26aedeede9534b948c539f8734c8492d>:0 
  at System.Collections.Generic.HashSet`1[T].Add (T item) [0x00000] in <26aedeede9534b948c539f8734c8492d>:0 
  at MyLib.MyClass.DoProcessing () [0x00a6e] in <66a585adc1684679bfec565c73eb94e4>:0 
  at MyLib.MyClass.SynchProcessing () [0x00000] in <66a585adc1684679bfec565c73eb94e4>:0 
  at MyApp.Program.Main (System.String[] args) [0x00139] in <e80b0468d8e642129fa7c39d5b2bb0a0>:0 

除了HashSet&lt; long&gt ;,它有时出现在Dictionary&lt; long,Node&gt; (其中Node是两个浮点数的小类),但无论哪种方式,它总是在尝试添加元素时和System.Array:FastCopy中。 Mono的老版本在给出SIGSEGV时报告了同样的位置。错误发生在代码的单线程部分,其中正在读取数据。预处理(后来它是多线程的,但该代码尚未产生错误,可能是因为所有集合已经达到最大尺寸或缩小)

因此,当重新分配HashSet或Dictionary的基础数组时,内部指针似乎被破坏了。

有没有人见过这样的东西?我认为它看起来像内存管理器/垃圾收集器错误,甚至是Mono中的底层错误?然而,搜索谷歌和这个网站并没有改变任何东西。我看到Mono有一个新的GC,但是单声道-V表示它是默认运行的(并且在使用旧版本时正在生成SIGSEGV)。

有没有人有任何建议或解决方案可以尝试?

我不知道堆和&amp;发生此错误时的集合大小。接下来我会添加一些诊断来尝试和帮助,虽然它们会使它变慢并且只给出近似值(例如,每10,000个节点都有Console.WriteLine),

0 个答案:

没有答案