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

有帮助吗?

解决方案

邮政 应该让您开始使用各种选项..检查标记为“调试”的帖子..

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

其他提示

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

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

如果您无法轻松找出哪些线程被锁定,请使用中所示的方法 这篇文章在这里 跟踪每个线程的锁链。当进入循环时,循环中的线程就是死锁的线程。

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

您使用什么语言/IDE?

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top