记一次 .NET某炉膛锅炉检测系统 崩溃分析

💡 原文中文,约7700字,阅读约需19分钟。
📝

内容提要

本文讲述了作者朋友的软件经常崩溃的问题,通过WinDbg分析发现是托管堆损坏导致的。作者进一步分析发现崩溃发生在bgc线程上,而bgc线程正在做后台对象标记。作者观察到托管堆中有一个对象处于有损状态,但托管堆本身应该是没有问题的。作者进一步观察bgc线程的汇编代码发现了bug,最终作者关闭了bgc模式来解决问题。

🎯

关键要点

  • 作者朋友的软件经常崩溃,环境复杂,提供了崩溃的dump进行分析。
  • 使用WinDbg分析发现崩溃发生在bgc线程,可能是托管堆损坏。
  • 通过验证发现托管堆中有一个对象处于有损状态,但托管堆本身没有问题。
  • bgc线程的崩溃与其正在进行的后台对象标记有关,分析bgc的逻辑是关键。
  • 观察bgc线程附近的汇编代码,发现崩溃原因是r11=0导致的,r11的值来自于r8。
  • 进一步分析发现oo对象的类型异常,可能是BGC标记的错乱。
  • 最终确定是bgc在老环境下出现了bug,解决方案是关闭bgc模式。
➡️

继续阅读