记一次 .NET某施工建模软件 卡死分析 - 一线码农

记一次 .NET某施工建模软件 卡死分析 - 一线码农

💡 原文中文,约6800字,阅读约需17分钟。
📝

内容提要

朋友的软件出现卡死问题,分析dump后发现主线程在处理窗体样式时被AcLayers.dll中的临界区锁住,导致线程等待。建议避免使用PerformanceCounter类,问题得到解决。

🎯

关键要点

  • 朋友的软件出现卡死问题,分析dump后发现主线程在处理窗体样式时被AcLayers.dll中的临界区锁住,导致线程等待。

  • 使用k命令观察主线程,发现卡在NtWaitForAlertByThreadId,表示正在处理其他线程通过Invoke发送的信息。

  • AcLayers.dll用于处理系统级兼容性问题,查询注册表时存在锁操作,导致主线程等待。

  • 通过分析线程栈,发现持有锁的线程在执行CloseLagPerfData方法时一直在Sleep等待。

  • 问题的根源是PerformanceCounter类的调用,建议避免使用该类,问题得到解决。

延伸问答

朋友的软件卡死的原因是什么?

软件卡死是因为主线程在处理窗体样式时被AcLayers.dll中的临界区锁住,导致线程等待。

如何分析软件卡死问题?

可以通过分析dump文件,使用k命令观察主线程的状态,查看线程栈以确定卡死位置。

AcLayers.dll的作用是什么?

AcLayers.dll用于处理系统级兼容性问题,查询注册表时会涉及锁操作。

为什么建议避免使用PerformanceCounter类?

PerformanceCounter类的调用会导致线程在CloseLagPerfData方法中等待,从而引发程序卡死。

如何解决软件卡死的问题?

通过避免调用PerformanceCounter类,问题得以解决,软件不再卡死。

在分析dump时如何获取锁的持有信息?

可以使用!cs -l或!locks命令,或者通过线程栈提取ntdll!RtlEnterCriticalSection方法的参数。

➡️

继续阅读