The case of the UI thread that hung in a kernel call
a year ago
- #debugging
- #thread-suspension
- #deadlock
- 客户报告了一个UI线程挂起问题,由于堆栈被换出而无法诊断
- 该线程被挂起超过五小时,但未附加调试器来解释挂起原因
- 发现同一进程内的看门狗线程会挂起UI线程以捕获堆栈跟踪,从而导致死锁
- 死锁发生的原因是UI线程持有看门狗线程捕获堆栈跟踪所需的锁
- 挂起同一进程内的线程存在死锁风险,如果被挂线程持有其他线程所需的资源
- 解决方案是使用外部进程实现看门狗功能以避免死锁
- 内核会延迟线程挂起以避免中断关键操作,但这不能防止用户模式的死锁
- 微软关于线程挂起和加载器锁的设计选择受到批评,但根本问题在于进程内看门狗机制