2009-12-10 56 views
0

期間我有偶爾被「卡住」,而加載(相當大的)應用程序 - 半繪控件等提示工作,爲什麼我的應用程序有時會「掛起」負載

從我所管理從日誌記錄開始,這發生在_Load事件結束後。

我從Visual Studio運行的唯一一次發生,我試着做了一個暫停,它只是把我帶到主要的Application.Run行,所以沒有多大幫助。

taskman的不說,該應用程序是「沒有響應」 - 但也許我不會等待足夠長的時間,它的工作說出來(任何人都知道需要多長時間?)

我要去繼續嘗試縮小範圍(測試機器上的ProcessExplorer等),但是如果任何人有任何想要搜索的方向,在我開始將printfs全部通過我的代碼之前...

回答

1

使用類似的分析器dotTRACEANTS。另外,當你暫停時,如果你的代碼在另一個線程上運行,你可以通過選擇切換到另一個線程:

Debug - > Windows - > Threads。

0

您可以嘗試附加分析器並查看啓動過程中何時花費的時間。這可能表明你是一個好人選。

0

通過它的聲音,你可以有一個無限循環的地方。我會看看Load事件之後發生的任何漫長的過程和/或循環。

+0

是的,但有時只是一個無限循環,這是我無法理解的。 – Benjol 2009-12-10 12:43:49

+0

是的,所以我會檢查你的所有循環,即通過它們並仔細檢查它們是否不依賴於設置的任何特定標誌。再次,它只是在黑暗中拍攝,因爲沒有代碼供我調試:) – James 2009-12-10 12:50:51

0

如果在調試器中沒有發生問題,您可以運行該程序,等待它掛起,然後從Visual Studio中去附加到進程...(在VS2005的工具菜單下) 。

然後通過提到的其他海報來看看主題。

1

您提供的診斷與行爲相符。表單的Load事件將是表單繪製之前運行的代碼的最後一位。顯示的事件將是下一個。調試器確實會停止在Application.Run()調用上,這是您爲調試器提供的源代碼信息編寫的最後一段代碼。

關鍵是要仔細檢查調用堆棧窗口,在Application.Run之上應該有額外的堆棧框架。如果導致掛起的代碼是託管代碼,則排在前面的是麻煩製造者。如果您需要該代碼,您將無法使用源代碼,因此使用Microsoft Reference Source服務器進行安裝非常重要。

但是它不太可能是託管代碼,絕大多數Paint事件處理程序都是非託管代碼,無論是在Windows中還是某種ActiveX控件。要深入瞭解這類代碼,您需要啓用非託管調試。項目+屬性,調試選項卡。另外,Tools + Options,Debugger關閉「Just my code」。從微軟的符號服務器調試符號的設置對於理解堆棧跟蹤很重要,如果只在堆棧跟蹤中獲得十六進制地址,那麼這樣做很重要。

接下來,您應該能夠通過觀察正在繪製的內容以及沒有繪製的內容來了解​​特定的控件是如何引起此問題的。控制按照Z順序繪製,你看不到,或只看到一部分,應該是麻煩製造者。繪畫掛在Windows或.NET控件是聞所未聞,懷疑您的窗體上的任何類型的ActiveX控件。

相關問題