记一次 .NET某工业设计软件 崩溃分析
💡
原文中文,约7700字,阅读约需19分钟。
📝
内容提要
本文讲述了作者在调试软件崩溃问题时的经历,通过使用WinDbg分析崩溃日志,发现崩溃是由于执行自身代码时抛出了灾难性异常导致的。进一步分析发现,异常是由于一个接口Stub调用的崩溃引起的。作者提出了三个解决办法:预热接口方法、隔离托管C++和C#、重点观察多Domain下的托管调用。最后总结说,多Domain和托管C++混合编程的问题很难解决。
🎯
关键要点
-
作者通过WinDbg分析软件崩溃问题,发现崩溃源于CLR执行自身代码时抛出灾难性异常。
-
崩溃的根本原因是接口Stub调用导致的,具体是由于this指针为null。
-
分析CLR源代码后发现,问题出在VirtualCallStubManager的FindStubManager方法返回null。
-
在托管层面,使用反射实现功能增强,导致接口调用出现问题。
-
程序使用多AppDomain和托管C++混合编程,增加了调试的复杂性。
-
作者提出三种解决办法:预热接口方法、隔离托管C++和C#、观察多Domain下的托管调用。
-
总结认为,多Domain和托管C++混合编程的问题难以解决。
➡️