一位朋友的工厂程序因主线程通过ShowConfirmDialog调用NtUserShowWindow时,发送消息给其他窗口未响应而卡死。通过使用procdump获取内核态栈,最终定位了问题。
近期MySql.Data驱动导致程序卡死,因其同步方法实为异步包装,造成线程饥饿。建议使用纯异步写法或退回低版本以避免此问题。MySql.Data项目未开issue栏,影响社区反馈。
文章讲述了作者一个月未更新博客的原因,包括被狗咬、买房和孩子参加跳绳比赛的焦虑。随后,作者分析了程序卡死的问题,使用WinDbg工具检查主线程和GC状态,发现是一个线程因死循环导致GC无法暂停,建议通过增加Thread.Sleep来解决。
本文介绍了一次程序卡死的故障排查过程,通过使用Windbg工具分析程序,发现是SQL查询导致的问题。通过观察所有线程栈,发现有两个线程在请求SQLSERVER,并在等待返回结果。进一步提取其中一个线程的SqlCommand对象,发现SQL语句没有加nolock导致在SQLSERVER层面一直获取不到S锁。通过观察SQL的请求时间,发现这条SQL已经等待了1分43秒,需要在SQLSERVER端查看锁相关的DMV视图,加上nolock尝试解决问题。最终朋友在SQLSERVER层面修改了max degree of parallelism来提高并发度,问题得到缓解。
文章讲述了通过WinDbg分析程序卡死问题,最终定位到问题代码是IntPtr handle = this.Handle,解决办法是用bp拦截System.Windows.Forms.Application+MarshalingControl..ctor方法。
完成下面两步后,将自动完成登录并继续当前操作。