除此之外,假设我在 VS 中运行我的应用程序,我不知道现在是否可以重现它(我已经使用这个特定应用程序一两个星期没有问题)调试器,发生死锁后我应该如何进行调试?我认为如果我暂停程序我可能能够获得调用堆栈并因此查看它发生时不同线程的位置,但是单击暂停也只会使 Visual Studio 陷入死锁,直到我终止我的应用程序。
除了浏览我的源代码树以查找潜在问题之外,还有其他方法吗?一旦出现问题,是否有办法进入调用堆栈以查看问题出在哪里?还有其他可能有用的工具/提示/技巧吗?
最佳答案
你做的是正确的方法。如果 Visual Studio 也死锁,这种情况时有发生。这只是运气不好,除非有其他问题。
您不必为了调试而在调试器中运行应用程序。正常运行应用程序,如果发生死锁,您可以稍后附加VS。 Ctrl+Alt+P,选择进程,选择调试器类型并点击附加。使用一组不同的调试器类型可能会降低 VS 崩溃的风险(特别是如果您不调试 native 代码)
死锁涉及 2 个或更多线程。您可能知道第一个(可能是您的 UI 线程),因为您注意到应用程序中的死锁。现在你只需要找到另一个。了解架构后,应该很容易找到它(例如,其他哪些线程使用相同的锁,与 UI 交互等)
如果 VS 根本不工作,您始终可以使用 windbg。在这里下载:http://www.microsoft.com/whdc/devtools/debugging/default.mspx
关于c# - 如何调试死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1147387/