记一次 .NET 某医院门诊软件 卡死分析

💡 原文中文,约7700字,阅读约需19分钟。
📝

内容提要

本文通过WinDbg分析窗体程序卡死问题,发现是因为上层不合理调用导致_queueIn意外为0,去掉SpeakAsyncCancelAll后问题得到解决。

🎯

关键要点

  • 朋友的软件在客户那边卡死,使用任务管理器抓取dump进行分析。
  • 通过WinDbg分析发现主线程的COM Apartment模式为STA,属于窗体程序。
  • 卡死原因是线程在Monitor.ReliableEnter上等待锁,锁对象由VoiceSynthesis创建的后台线程持有。
  • 分析发现VoiceSynthesis的waveOutClose方法可能导致死锁,原因在于上层不合理调用导致_queueIn为0。
  • 最终通过去掉SpeakAsyncCancelAll函数解决了卡死问题。
➡️

继续阅读