记一次 .NET某医疗器械清洗系统 卡死分析

💡 原文中文,约5100字,阅读约需12分钟。
📝

内容提要

文章讲述了通过WinDbg分析程序卡死问题,最终定位到问题代码是IntPtr handle = this.Handle,解决办法是用bp拦截System.Windows.Forms.Application+MarshalingControl..ctor方法。

🎯

关键要点

  • 文章讲述了通过WinDbg分析程序卡死问题的背景。
  • 使用WinDbg分析程序卡死时,首先查看主线程的状态。
  • 卡死问题源于win32u!NtUserPeekMessage方法的调用。
  • 通过观察内核态,确认线程在等待消息。
  • 使用!process命令查看进程和线程信息。
  • 分析线程栈,发现win32kfull!xxxSendMessage方法的调用。
  • 提取发送消息的窗体句柄,确认是由另一个线程创建的用户控件。
  • 非主线程创建用户控件导致的卡死问题是常见错误。
  • 解决办法是用bp拦截System.Windows.Forms.Application+MarshalingControl..ctor方法。
  • 最终定位到问题代码是IntPtr handle = this.Handle,解决了卡死问题。
➡️

继续阅读