簡體   English   中英

找出為什么我的應用程序有時在加載期間“掛起”的提示

[英]Tips for working out why my application sometimes 'hangs' during Load

我有一個(相當大的)應用程序,在加載時偶爾會“卡住”-控件一半被繪制等。

從我設法從日志記錄中得出的結果來看,這發生在_Load事件結束之后。

從Visual Studio運行時,這是我唯一的一次嘗試,嘗試暫停一下,它只是將我帶到main中的Application.Run行,所以並沒有太大幫助。

TaskMan並不是說應用程序“沒有響應”-但是也許我沒有等待足夠長的時間來解決該問題(任何人都知道需要多長時間?)

我將繼續嘗試縮小范圍(在測試機上使用ProcessExplorer等),但是如果有人對搜索的方向有任何想法,那么在我開始將printfs全部放入代碼之前...

使用諸如dotTRACEANTS之類的探查器。 同樣,在暫停時,如果代碼在另一個線程上運行,則可以通過選擇以下命令切換到另一個線程:

調試-> Windows->線程

您提供的診斷與行為匹配。 表單的Load事件將是表單繪制自身之前運行的代碼的最后一部分。 Shown事件將是下一個。 調試器確實會停止對Application.Run()的調用,這是您編寫的代碼的最后一部分,調試器具有源代碼信息。

關鍵是要仔細檢查``調用堆棧''窗口,在應用程序上方應有其他堆棧幀。運行一個。 如果導致掛起的代碼是托管代碼,則最麻煩的是麻煩制造者。 您將沒有源代碼,如果需要該代碼,則使用Microsoft Reference Source服務器進行設置非常重要。

但是它不太可能是托管代碼,在Windows或某種ActiveX控件中,絕大多數的Paint事件處理程序都是非托管代碼。 要深入了解此類代碼,您需要啟用非托管調試。 項目+屬性,調試選項卡。 另外,在“工具+選項”,“調試器”中,關閉“僅我的代碼”。 從Microsoft的符號服務器進行調試符號的設置對於理解堆棧跟蹤可能很重要,如果僅在堆棧跟蹤中獲取十六進制地址,則應這樣做。

接下來,您應該能夠通過觀察油漆和不油漆來查看是什么特定的控件導致了此問題。 控件按Z順序繪制,您看不到或僅部分看到的控件應該是制造麻煩的人。 Windows或.NET控件上的繪畫掛起是聞所未聞的,懷疑您的窗體上有任何類型的ActiveX控件。

您可以嘗試附加探查器,並查看啟動過程中花費的時間。 那可能會指出你是一個好的候選人。

聽起來,您可能會在某處無限循環。 我將研究在您的Load事件之后發生的任何漫長的過程和/或循環。

如果調試器中未出現問題,則可以運行該程序,等待其掛起,然后從Visual Studio中轉到“ 附加到進程...” (在VS2005中的“工具”菜單下)。

然后看一看其他海報中提到的主題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM