记一次 .NET某施工建模软件 卡死分析
💡
原文中文,约7400字,阅读约需18分钟。
📝
内容提要
本文讲述了作者朋友的软件卡死问题,通过WinDbg分析发现是AcLayers.dll的lock操作导致的。问题是由PerformanceCounter类引发的,去掉该类后问题解决。
🎯
关键要点
- 作者朋友的软件卡死问题通过WinDbg分析发现是AcLayers.dll的lock操作导致的。
- 问题由PerformanceCounter类引发,去掉该类后问题解决。
- 分析过程中使用了k命令观察主线程,发现卡在NtWaitForAlertByThreadId。
- AcLayers.dll用于处理系统级兼容性问题,查询注册表时存在lock操作。
- 通过分析线程栈,发现持有临界区锁的线程在执行CloseLagPerfData方法时一直在Sleep等待。
- 最终建议朋友避免使用PerformanceCounter类,问题得以解决。
❓
延伸问答
软件卡死的原因是什么?
软件卡死是由于AcLayers.dll的lock操作导致的,具体是由PerformanceCounter类引发的问题。
如何使用WinDbg分析软件卡死问题?
可以使用WinDbg的k命令观察主线程,分析线程栈来查找卡死的原因。
AcLayers.dll的作用是什么?
AcLayers.dll用于处理系统级兼容性问题,特别是在查询注册表时会涉及到lock操作。
PerformanceCounter类引发卡死的机制是什么?
PerformanceCounter类在执行CloseLagPerfData方法时导致线程进入Sleep状态,从而持有锁不释放,造成卡死。
如何解决软件卡死的问题?
去掉PerformanceCounter类的使用后,软件卡死的问题得以解决。
在分析过程中如何观察持有锁的线程?
可以使用!cs命令查看临界区锁的持有信息,或者通过线程栈分析来获取持锁线程的信息。
➡️