记一次 .NET 某医院门诊软件 卡死分析
原文中文,约7700字,阅读约需19分钟。
📝
内容提要
本文通过WinDbg分析窗体程序卡死问题,发现是因为上层不合理调用导致_queueIn意外为0,去掉SpeakAsyncCancelAll后问题得到解决。
🎯
关键要点
-
朋友的软件在客户那边卡死,使用任务管理器抓取dump进行分析。
-
通过WinDbg分析发现主线程的COM Apartment模式为STA,属于窗体程序。
-
卡死原因是线程在Monitor.ReliableEnter上等待锁,锁对象由VoiceSynthesis创建的后台线程持有。
-
分析发现VoiceSynthesis的waveOutClose方法可能导致死锁,原因在于上层不合理调用导致_queueIn为0。
-
最终通过去掉SpeakAsyncCancelAll函数解决了卡死问题。
🏷️