记一次 .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命令查看临界区锁的持有信息,或者通过线程栈分析来获取持锁线程的信息。

➡️

继续阅读