2010-11-30 42 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

在跟蹤:這是非常有用的,但要小心不要用跟蹤代碼引入更多的鎖定問題。即控制檯輸出調用速度較慢並且序列化,因此您的掛起可能會消失。