记一次 .NET某炉膛锅炉检测系统 崩溃分析
💡
原文中文,约7700字,阅读约需19分钟。
📝
内容提要
本文讲述了作者朋友的软件经常崩溃的问题,通过WinDbg分析发现是托管堆损坏导致的。作者进一步分析发现崩溃发生在bgc线程上,而bgc线程正在做后台对象标记。作者观察到托管堆中有一个对象处于有损状态,但托管堆本身应该是没有问题的。作者进一步观察bgc线程的汇编代码发现了bug,最终作者关闭了bgc模式来解决问题。
🎯
关键要点
- 作者朋友的软件经常崩溃,环境复杂,提供了崩溃的dump进行分析。
- 使用WinDbg分析发现崩溃发生在bgc线程,可能是托管堆损坏。
- 通过验证发现托管堆中有一个对象处于有损状态,但托管堆本身没有问题。
- bgc线程的崩溃与其正在进行的后台对象标记有关,分析bgc的逻辑是关键。
- 观察bgc线程附近的汇编代码,发现崩溃原因是r11=0导致的,r11的值来自于r8。
- 进一步分析发现oo对象的类型异常,可能是BGC标记的错乱。
- 最终确定是bgc在老环境下出现了bug,解决方案是关闭bgc模式。
❓
延伸问答
软件崩溃的主要原因是什么?
软件崩溃主要是由于托管堆损坏,特别是在bgc线程进行后台对象标记时发生的错误。
如何使用WinDbg分析崩溃问题?
使用WinDbg可以通过命令如!analyze -v和!verifyheap来定位崩溃位置和验证托管堆的完整性。
bgc线程崩溃与哪个操作有关?
bgc线程崩溃与其正在进行的后台对象标记操作有关,特别是在重定位阶段出现了问题。
如何解决bgc线程导致的崩溃问题?
解决bgc线程导致的崩溃问题的方法是关闭bgc模式,即在配置文件中设置<gcConcurrent enabled="false"/>。
托管堆的损坏是如何被验证的?
托管堆的损坏通过WinDbg的!verifyheap命令进行验证,发现有对象处于有损状态。
崩溃分析中发现的关键汇编代码是什么?
关键汇编代码显示r11=0导致崩溃,r11的值来自于r8,这表明在bgc线程的执行中出现了问题。
➡️