2010-02-23 39 views
5

我正在用C#開發WinForm多線程應用程序。 有時會發生我的應用程序掛起,或凍結或阻止。知道應用何時凍結

發生這種情況時,我在DEBUG模式下運行,是否有任何理解我的應用程序目前在哪一行代碼?由於它被凍結,我期望找到應用程序被鎖定或阻止的點。 有可能做到這一點嗎?

當它凍結時,我試圖打開CALL STACK窗口,但是這不顯示任何信息;有沒有我可能做的一些行動?一些「暫停和檢查」或其他?

回答

5

您可能需要打開「線程」窗口並更改當前線程。在調試時,選擇Debug-> Break All,然後打開Threads窗口。如果你通過每個線程,雙擊線程,你應該能夠調查每個線程的調用棧。

這就是說,如果你可以在VS 2010中運行你的程序 - 這會容易得多。在VS 2010中,您可以使用新的Concurrency Profiler,並在Concurrency Profiler下運行您的代碼,並選擇可視化多線程應用程序的行爲。一旦你的應用程序被鎖定,將它關閉,然後讓探查器崩潰 - 最終,你會看到一個圖表,它顯示了程序中的每個線程以及它們被鎖定的時間。將顯示每個阻塞線程的調用堆棧以及正在進行的鎖定(使用源代碼行)。這使得追蹤死鎖非常容易。

+0

嗨裏德!非常感謝您的迴應!還有一件小事情,如果你仍然在附近......我沒有VS 2010,我仍然在使用VS 2008.你知道是否有一些很好的免費工具可以產生或多或少與剛描述的線程圖相同的東西嗎?謝謝你的幫助。 – 2010-02-23 19:41:58

+0

不 - 我不知道什麼是免費的,完全靠近。英特爾的線程工具包可以工作(但非常昂貴)。你可以免費下載VS 2010 RC Ultimate,然後在你的項目中運行它... – 2010-02-23 20:24:21

+0

嗨裏德!非常感謝你的幫助!祝你今天愉快! – 2010-02-24 08:24:57

2

當連接調試器時,進入調試菜單並選擇'全部中斷'...然後您可以檢查所有線程的調用堆棧。

+0

酷!謝啦! – 2010-02-23 19:44:13

2

你可以按暫停,看看它在哪裏結束(使用前面提到的調用堆棧窗口)。然而有可能你會以本地代碼結束。你可以試着走出一點,或者只是看看堆棧中的託管函數進行調試。

或者,您可以在應用程序「凍結」之後放置一個斷點,並嘗試查明不會結束的循環。

以上都假設您的應用程序正忙(100%CPU使用率)。如果您的應用程序被困在死鎖中,或者只是簡單地等待不會打勾的互斥鎖,那麼您必須手動重新讀取代碼並嘗試自行計算出來。

+0

奧赫!真?手動讀取代碼是唯一能找出死鎖位置的方法嗎?幾次之前,我讀到了一個名爲WinDbg的強大工具。你有沒有使用過,並且你知道該表是否能夠幫助我檢測應用程序被刪除的代碼片段嗎? – 2010-02-23 19:46:18

+0

好吧,如果你處於死鎖狀態,你的線程就會停留在rtl dll深處的某個函數中直到調度器確定條件滿足爲止。調用堆棧不會告訴您正在等待的條件。 – Blindy 2010-02-23 23:03:56