相关疑难解决方法(0)

如何在.NET运行时调试内部错误?

我正在尝试调试一些处理大文件的工作.代码本身有效,但.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
}
Run Code Online (Sandbox Code Playgroud)

(带有一些时间和其他东西)

循环将完全成功地处理非确定性迭代次数- 没有任何问题; 那么这个过程会突然终止.异常处理程序未被命中.测试确实涉及大量的内存使用,但它在每次迭代过程中锯齿非常好(没有明显的内存泄漏,并且我有足够的空间 - 在锯齿的差点处有14GB未使用的主存储器) .该过程是64位.

Windows错误日志包含3个新条目,(通过退出代码80131506)建议执行引擎错误 - 一个讨厌的小动物.一个相关的答案,建议GC错误,用"修复"来禁用并发GC; 但是这个"修复"并不能解决这个问题.

澄清:这个低级错误没有触及CurrentDomain.UnhandledException事件.

澄清:GC.Collect只有监控锯齿状记忆,检查内存泄漏并保持可预测性; 删除它不会使问题消失:它只是使它在迭代之间保持更多内存,并使dmp文件更大; p

通过添加更多的控制台跟踪,我发现它在以下每个过程中出现故障:

  • 在反序列化期间(大量分配等)
  • GC期间(GC"方法"和GC"完成"之间,使用GC通知API)
  • 在验证期间(仅仅是foreach一些数据) …

.net c#

67
推荐指数
2
解决办法
4317
查看次数

标签 统计

.net ×1

c# ×1