调试由于 Win32 生产过程中的死锁而导致的明显挂起的步骤和技术是什么。我听说 WinDbg 可以用于此目的,但您能否提供有关如何实现此目的的明确提示?
6 回答
如果您可以访问源代码和内存转储(或实时调试会话),那么调试真正的死锁实际上很容易。
您所做的就是查看线程,并找到正在等待某种共享资源的线程(例如挂起等待WaitForSingleObject
)。一般来说,从那里找出两个或多个线程相互锁定的问题,然后您只需要找出哪个线程破坏了锁定层次结构。
如果您无法轻松确定哪些线程被锁定,请使用本文中显示的方法来跟踪每个线程的锁链。当您进入循环时,循环中的线程就是死锁的线程。
如果你很懒,你可以安装 Application Verifier,然后添加你的模块并从基本测试中选择“锁”。然后您可以在任何调试器下运行您的应用程序。
如果发生临界区死锁,您可以立即找到原因。
您使用的是什么语言/IDE?
在 .Net 中,您可以查看应用程序的线程:Debug->Windows->Threads 或 Ctrl+Alt+H
调试死锁可能很棘手。我通常会进行某种日志记录并查看日志停止的位置。我使用 OutputDebugString() 记录到文件或调试控制台。
最好的办法是从添加日志语句开始。一般来说,我只建议围绕死锁的共享资源,但通常添加它们可能会指向您未预料到的情况或代码区域。广为人知的 stackoverflow.com 数据库问题实际上是 log4net!stackoverflow 团队从未怀疑过 log4net,只有通过检查日志(讽刺地)才表明了这一点。我最初会放弃任何复杂的工具,例如 WinDgb,因为恕我直言,使用它们不是很直观。