诊断Win32程序中的死锁

时间:2008-09-18 01:10:32

标签: winapi windbg deadlock production

由于Win32生产过程中的死锁而调试明显挂起的步骤和技术是什么。我听说WinDbg可以用于此目的,但请您提供明确的提示,说明如何实现这一目标?

6 个答案:

答案 0 :(得分:8)

这个post应该让你开始使用各种选项。检查用调试标记的帖子..

关于debugging deadlocks的另一篇有用的文章..

答案 1 :(得分:4)

如果您有权访问源和内存转储(或实时调试会话),那么调试真正的死锁实际上很容易。

您只需查看线程,找到正在等待某种共享资源的线程(例如在WaitForSingleObject中挂起等待)。一般来说,从那里可以搞清楚哪两个或多个线程相互锁定了,然后你只需要找出哪个线程打破了锁定层。

如果您无法轻易确定哪些线程被锁定,请使用this post here中显示的方法跟踪每个线程的锁定链。当你进入循环时,循环中的线程就是死锁的。

答案 2 :(得分:1)

如果您非常懒,可以安装Application Verifier,然后添加模块并从基本测试中选择“锁定”。 然后你可以在任何调试器下运行你的应用程序 如果发生关键部分死锁,你立即找到原因。

答案 3 :(得分:0)

您使用的是哪种语言/ IDE?

在.Net中,您可以查看应用程序的主题:Debug-> Windows-> Threads或Ctrl + Alt + H

答案 4 :(得分:0)

调试死锁可能很棘手。我经常做某种日志记录,看看日志停止的地方。我使用OutputDebugString()登录文件或调试控制台。

答案 5 :(得分:-1)

最好的方法是首先添加日志记录语句。一般情况下,我建议只使用死锁的共享资源,但一般情况下添加它们可能会指向您不期望的情境或代码区域。广为人知的stackoverflow.com数据库问题实际上证明是log4net! stackoverflow团队从不怀疑log4net,只有通过检查日志记录(具有讽刺意味)才能显示出来。我最初会放弃任何复杂的工具,例如WinDgb,因为使用它们不是很直观的恕我直言。