2010-11-30 43 views
1

我有一个多线程的代码,在某些情况下挂起。我想知道什么是推荐的调试方式?如何调试挂起的代码

+3

如果你不给我们一个你在做什么的想法,我们不能帮你 – 2010-11-30 01:09:31

+0

一个真正的质量questionn,但它是我最爱的标题:D – 2010-11-30 01:14:22

回答

1

当它挂起时,您可以附加调试器并检查线程状态(包括调用堆栈)到您的心脏内容。通常会有一个(或多个)线程处于等待状态,您可能会弄清楚原因。

如果在挂起时状态不是不言自明,那么您可以使用建议的技术来为前面的程序流提供上下文信息。

0

因为它是多线程的,所以不能进行调试,比如设置断点,跟踪语句并暂停查看变量的值。我认为唯一的方法是打印到控制台并从那里查看状态。

1

它是否经常挂起(即你不需要等待几小时/天的挂起)?如果它很少挂起 - 抓取完整转储(即使用任务管理器)稍后用WinDbg进行调试。 如果它足够挂起 - Visual Studio更容易使用 - 只需附加(调试 - >附加到进程)以按照前面的建议挂起进程(除非使用Express版本 - “附加”不是它的一部分)

VS中最有用的视图是Debug - > Window - > Threads在一个窗口中,Debug - > Call Stack在另一个窗口中。跳过所有线程,看看是否有线程正在等待某些公共对象。

有很多关于如何使用WinDbg调试挂起的信息 - 搜索“windbg sos hang”以查找详细信息。即http://blogs.msdn.com/b/tess/archive/2009/10/19/net-hang-case-study-the-danger-of-locking-on-strings.aspx

退房波多黎各马里亚尼的博客 - http://blogs.msdn.com/b/ricom/archive/2010/06/04/debugging-multi-threaded-applications-some-tidbits.aspx

在跟踪:这是非常有用的,但要小心不要用跟踪代码引入更多的锁定问题。即控制台输出调用速度较慢并且序列化,因此您的挂起可能会消失。