我有一个多线程代码,在某些情况下会挂起。我想知道推荐的调试方法是什么?
答案 0 :(得分:1)
当它挂起时,您可以附加调试器并检查线程状态(包括callstack)到您心脏的内容。通常会有一个(或多个)线程处于等待状态,并且您可能能够找出原因。
如果状态在挂起时不能自我解释,您可以使用建议的技术为前面的程序流提供上下文信息。
答案 1 :(得分:1)
它是否经常挂起(即您不需要等待数小时/天才能挂起)?如果它很少挂起 - 抓取完全转储(即使用任务管理器)以便稍后使用WinDbg进行调试。 如果它已经足够了 - Visual Studio更容易使用 - 只需附加(Debug - > Attach to process)挂起进程就像之前建议的那样(除非你使用Express版本 - “attach”不是它的一部分)
VS中最有用的视图是Debug - >窗口 - >一个窗口中的线程和调试 - >在另一个中调用堆栈。跳转所有线程,查看是否有线程在等待某些常见对象。
有很多关于如何使用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
查看Rico Mariani的博客 - http://blogs.msdn.com/b/ricom/archive/2010/06/04/debugging-multi-threaded-applications-some-tidbits.aspx
跟踪:它非常有用,但请注意不要在跟踪代码中引入更多锁定问题。即控制台输出调用很慢并且是序列化的,因此您的挂起可能会消失。
答案 2 :(得分:0)
因为它是多线程的,所以无法进行调试,例如设置断点,跟踪语句和暂停以查看变量的值。在我看来,唯一的方法是打印到控制台并从那里查看状态。