我正在try 调试一些处理大文件的工作.代码本身为works,但是.NET运行时本身报告了零星的错误.对于上下文,这里的处理是一个1.5 GB的文件(只加载到内存中一次),在循环中处理和释放,故意try 重现这个本来不可预测的错误.
我的测试片段基本上是:
try {
byte[] data =File.ReadAllBytes(path);
for(int i = 0 ; i < 500 ; i++)
{
ProcessTheData(data); // deserialize and validate
// force collection, for tidiness
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
}
} catch(Exception ex) {
Console.WriteLine(ex.Message);
// some more logging; StackTrace, recursive InnerException, etc
}
(加入了一些时间和其他东西)
对于非确定性的fully successfully次迭代,循环将处理得很好——没有任何问题;然后这个过程就会突然终止.异常处理程序未命中.该测试确实涉及大量内存使用,但在每次迭代过程中都非常顺利(没有明显的内存泄漏,我有足够的空间——在锯齿中的worst点有14GB未使用的主内存).该进程是64位的.
windows错误日志(log)包含3个新条目(通过退出代码80131506),表明执行引擎错误——一个令人讨厌的小家伙.related answer表示GC错误,带有"修复"以禁用并发GC;然而,这种"修复"并不能阻止这个问题.
澄清:此低级错误不会影响CurrentDomain.UnhandledException
事件.
澄清:GC.Collect
只用于监控锯齿状内存,判断内存泄漏并保持可预测性;删除它并不会使问题消失:它只会使它在迭代之间保留更多内存,并使dmp文件更大;P
通过添加更多控制台跟踪,我观察到它在以下每个过程中都出现故障:
- 反序列化期间(大量分配等)
- 在GC期间(在GC"方法"和GC"完成"之间,使用GC通知API)
- 在验证过程中(部分数据上只有
foreach
个)——奇怪的是,just after个GC在验证过程中"完成"
所以有很多不同的场景.
我可以获得崩溃转储(dmp)文件;我怎样才能进一步调查这一点,看看当系统如此惊人地失败时,它在做什么?