我正在尝试调试一些处理大文件的工作。该代码本身可以工作,但是.NET Runtime本身报告了零星的错误。就上下文而言,此处的处理是一个1.5GB的文件(仅一次加载到内存中),正在处理并循环释放,以尝试重现此否则无法预测的错误。
我的测试片段基本上是:
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
}
(加上一些时间安排和其他东西)
对于不确定的迭代次数,该循环将完全成功地处理-毫无问题;然后该过程将突然终止。未命中异常处理程序。该测试确实涉及大量内存使用,但是在每次迭代中它的锯齿效果都非常好(没有明显的内存泄漏,而且我还有足够的余量-锯齿最坏的地方有14GB的未使用主内存) 。该过程是64位的。
Windows错误日志包含3个新条目,这些条目(通过退出代码80131506)建议执行引擎错误-讨厌的小动物。一个相关的答案表明存在GC错误,并带有“修复”以禁用并发GC。但是,此“修复”并不能阻止该问题。
澄清:此低级错误不会触发该CurrentDomain.UnhandledException事件。
澄清:GC.Collect只能监视锯齿状内存,检查内存泄漏并保持可预测的状态;删除它并不会解决问题:只是使它在两次迭代之间保留更多的内存,并使dmp文件更大; p
通过添加更多的控制台跟踪,我发现它在以下每个过程中都出现了错误:
- 反序列化期间(大量分配等)
- 在GC期间(使用GC通知API)(在GC“方法”和GC“完成”之间)
- 在验证期间(仅对
foreach某些数据进行检查)-奇怪的是,在验证期间GC“完成”之后
有很多不同的场景。
我可以获得崩溃转储(dmp)文件;我如何进一步调查这件事,以查看系统出现如此严重的故障时正在做什么?