记一次 .NET某炉膛锅炉检测系统 崩溃分析
💡
原文中文,约7700字,阅读约需19分钟。
📝
内容提要
本文讲述了作者朋友的软件经常崩溃的问题,通过WinDbg分析发现是托管堆损坏导致的。作者进一步分析发现崩溃发生在bgc线程上,而bgc线程正在做后台对象标记。作者观察到托管堆中有一个对象处于有损状态,但托管堆本身应该是没有问题的。作者进一步观察bgc线程的汇编代码发现了bug,最终作者关闭了bgc模式来解决问题。
🎯
关键要点
- 作者朋友的软件经常崩溃,环境复杂,提供了崩溃的dump进行分析。
- 使用WinDbg分析发现崩溃发生在bgc线程,可能是托管堆损坏。
- 通过验证发现托管堆中有一个对象处于有损状态,但托管堆本身没有问题。
- bgc线程的崩溃与其正在进行的后台对象标记有关,分析bgc的逻辑是关键。
- 观察bgc线程附近的汇编代码,发现崩溃原因是r11=0导致的,r11的值来自于r8。
- 进一步分析发现oo对象的类型异常,可能是BGC标记的错乱。
- 最终确定是bgc在老环境下出现了bug,解决方案是关闭bgc模式。
➡️