除此之外,我不知道现在是否可以重现它(我已经使用这个特定的应用程序一两个星期没有问题了),假设我在 VS 调试器中运行我的应用程序,如何死锁发生后我应该去调试它吗?我认为如果我暂停程序,我可能能够访问调用堆栈,因此可以查看不同线程在发生时的位置,但是单击暂停只会使 Visual Studio 陷入死锁,直到我杀死我的应用程序。
除了浏览我的源代码树来查找潜在问题之外,还有其他方法吗?一旦问题发生,有没有办法在调用堆栈中查看问题所在?任何其他可能有帮助的工具/提示/技巧?
除此之外,我不知道现在是否可以重现它(我已经使用这个特定的应用程序一两个星期没有问题了),假设我在 VS 调试器中运行我的应用程序,如何死锁发生后我应该去调试它吗?我认为如果我暂停程序,我可能能够访问调用堆栈,因此可以查看不同线程在发生时的位置,但是单击暂停只会使 Visual Studio 陷入死锁,直到我杀死我的应用程序。
除了浏览我的源代码树来查找潜在问题之外,还有其他方法吗?一旦问题发生,有没有办法在调用堆栈中查看问题所在?任何其他可能有帮助的工具/提示/技巧?
你所做的是正确的方法。如果 Visual Studio 也出现死锁,这种情况不时发生。这只是运气不好,除非有其他问题。
您不必为了调试它而在调试器中运行应用程序。正常运行应用程序,如果发生死锁,可以稍后附加VS。Ctrl+Alt+P,选择进程,选择调试器类型,点击附加。使用一组不同的调试器类型可能会降低 VS 崩溃的风险(尤其是如果您不调试本机代码)
死锁涉及 2 个或更多线程。您可能知道第一个(可能是您的 UI 线程),因为您注意到应用程序中的死锁。现在你只需要找到另一个。了解架构后,应该很容易找到(例如,哪些其他线程使用相同的锁,与 UI 交互等)
如果 VS根本不起作用,您可以随时使用windbg。在此处下载:http: //www.microsoft.com/whdc/devtools/debugging/default.mspx
我会按以下顺序尝试不同的方法:
首先,检查代码以查找线程安全违规,确保您的关键区域不会调用其他函数,而这些函数会反过来尝试锁定关键区域。
使用任何你可以得到的工具来可视化线程活动,我使用内部 perl 脚本来解析我们制作的操作系统日志并绘制所有上下文切换并显示线程何时被抢占。
如果找不到好的工具,请进行一些日志记录以查看死锁发生之前运行的最后一个线程。这将为您提供可能导致问题的线索,如果锁定机制具有唯一名称(例如,如果对象具有自己的线程,则创建专用信号量或互斥锁来管理该线程)会有所帮助。
我希望这有帮助。祝你好运!
您可以使用不同的程序,例如 Intel(R) Parallel Inspector: http:
//software.intel.com/en-us/intel-parallel-inspector/
此类程序可以向您显示代码中存在潜在死锁的位置。但是,您应该为此付费,或者仅在评估期内使用它。不知道有没有这样的免费工具。
就像任何地方一样,没有“银弹”工具来解决所有的僵局。这完全与不同线程获取资源的顺序有关,因此您的工作是找出违反顺序的位置。通常 Visual Studio 或其他调试器会提供堆栈跟踪,您将能够找出差异所在。DevPartner Studio 确实提供了死锁分析,但上次我检查过有太多误报。一些静态分析工具也会发现一些潜在的死锁。
除此之外,它有助于让架构直接执行资源获取顺序。例如,分层有助于确保在较低级别的锁定之前获取较高级别的锁定,但要注意回调。