用WCT来分析进程卡死

多进程程序开发调试死锁跟无限等待锁是比较麻烦的,幸好Windows Vista之后,系统提供了一组WCT(Wait Chain Traversal)api来帮助我们诊断进程内部和进程之间的锁问题。win8的任务管理器已经带有这个”分析等待链”的功能了,如图:

20141228221449

windows核心编程里面对这个WCT机制有详细的介绍,并且作者写一个CWCT的类来封装WCT api,提供了一个友好的接口。MSDN这个也有WCT的详细文档http://msdn.microsoft.com/en-us/library/windows/desktop/ms681622(v=vs.85).aspx。

值得注意的是WCT还不支持直接诊断WaitForMultipleObjects类型的死锁,虽然我们可以从WCT中提供线程跟锁对象之间的关系发现出死锁。

周末的时候我也基于CWCT写了个卡死诊断工具,HangsDiagnoser。HangsDiagnoser现在可以输出WCT获得的等待链信息,如图:

20141228220554

虽然可以看出那些线程在等待和线程之间死锁关系,但是对于定位问题还是不够的,我们需要知道线程拥有什么对象,线程在等待什么对象,以及线程的Stack Trace。之前对于卡死这类问题,我们可以直接用windbg附加到被调试进程去定位问题,或者生成一个dump,事后再分析dump里面线程的状态。

对于HangsDiagnoser这个程序,我想下一步给它加上一个生成minidump的功能,还可以从minidump里面获取某个线程的Stack Trace信息,这样以后就方便我们分析问题了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注