5

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

4

6 回答 6

8

这篇文章应该让您开始使用各种选项..检查标记为调试的帖子..

关于调试死锁的另一篇有用的文章..

于 2008-09-18T01:15:25.300 回答
4

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

您所做的就是查看线程,并找到正在等待某种共享资源的线程(例如挂起等待WaitForSingleObject)。一般来说,从那里找出两个或多个线程相互锁定的问题,然后您只需要找出哪个线程破坏了锁定层次结构。

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

于 2008-09-18T01:22:58.480 回答
1

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

于 2008-09-24T12:00:35.423 回答
0

您使用的是什么语言/IDE?

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

于 2008-09-18T01:14:33.913 回答
-1

调试死锁可能很棘手。我通常会进行某种日志记录并查看日志停止的位置。我使用 OutputDebugString() 记录到文件或调试控制台。

于 2008-09-18T01:15:39.760 回答
-2

最好的办法是从添加日志语句开始。一般来说,我只建议围绕死锁的共享资源,但通常添加它们可能会指向您未预料到的情况或代码区域。广为人知的 stackoverflow.com 数据库问题实际上是 log4net!stackoverflow 团队从未怀疑过 log4net,只有通过检查日志(讽刺地)才表明了这一点。我最初会放弃任何复杂的工具,例如 WinDgb,因为恕我直言,使用它们不是很直观。

于 2008-09-18T01:23:11.147 回答