回答
如果幸運的話,您可以在調試器中運行您的代碼直到它凍結,然後停止調試器以查找有問題的代碼行。但如果這很容易,你可能不會徵求建議。 :-)
可以一起使用的兩種策略是「分而治之」和「留下面包屑」。
分而治之:註釋掉越來越大的部分代碼。如果它仍然凍結,你已經減少了可能導致凍結的代碼量。 注意:最終你會註釋掉一些代碼,程序將而不是凍結。這並不意味着代碼的最後一位必須是負責凍結;這只是不知何故涉及。把它放回去並註釋掉別的東西。
假面包屑:讓你的程序告訴你它在哪裏以及它在執行時的功能。顯示消息,添加到日誌文件,發出聲音或通過網絡發送數據包。您預期的執行路徑是什麼?它在凍結之前做的最後一件事是什麼?再次,請注意,最後一條消息可能來自與負責凍結程序的消息不同的線程,但當您更接近原因時,您將調整代碼記錄的內容和位置。
我會安裝UserDump工具,follow these instructions生成的應用程序的用戶轉儲....
一旦你的用戶轉儲,您可以使用WinDbg或CDB檢查線程,棧,和鎖等。
我經常發現掛起是由鎖定的互斥鎖或類似的東西造成的。
當你不應該的時候,你可能在UI線程中做了些什麼。
+1'occams'triage':) – 2009-11-27 23:26:44
這可能是可能的。有什麼方法可以更好地查明確切原因? – 2009-11-28 11:31:21
如果您想從正在運行的應用程序之外進行檢查,那麼我可能會使用Mark Russonivich的sysinternals.com工具集,perfmon工具允許您跟蹤文件/註冊表訪問並檢查跟蹤延遲 - 以及正在被訪問。它將顯示當時的DLL調用堆棧,正確的符號可用於調試導致延遲的應用程序外部的問題。 (我用它來發現一個與安全套件相關的I/O過濾器是一個應用程序嘎嘎了1.5秒延遲的原因。)
同意安德魯。 Sysinternals工具是識別應用程序凍結的堆棧的一部分的最簡單且最快速的方式 – 2009-11-27 23:49:49
好的一般策略是,運行程序直到它掛起。然後附加一個調試器,看看發生了什麼。在一個GUI程序中,你最關心的是UI線程正在做什麼。
你說應用程序掛起IDE。這不應該發生,我想這意味着程序正在給整個系統掙扎的操作系統(可能是CPU負載或內存)帶來很大的壓力。
嘗試運行它直到它掛起,返回到IDE,然後單擊「停止」按鈕。你可能必須非常耐心。如果IDE真的永久停留,那麼您必須提供有關您的情況的更多詳細信息以獲得有用的幫助。
- 1. 調試策略找到bad_alloc的原因
- 2. 高速緩存「隨機」數據的一般策略
- 3. CABasicAnimation原因凍結
- 4. urlopen隨機凍結,timout被忽略
- 5. 尋找隨機數
- 6. 尋呼策略
- 7. Python代碼隨機凍結
- 8. C#的WinForms:調試策略,找到原因System.AccessViolationException
- 9. Qt凍結循環的原因?
- 10. 64位Python的原因凍結
- 11. 尋找一些聰明的SQL策略來處理查找表
- 12. 原產地策略的主機名
- 13. 尋找NaN的錯誤的原因
- 14. 角度釋放時間一般策略?
- 15. NAudio - 創建軟件拍子機/採樣器 - 一般策略
- 16. 尋找多線程死鎖的原因?
- 17. 尋找ASP的原因錯誤
- 18. 的Android:的ServerSocket.accept()隨機凍結
- 19. Web應用程序凍結。我如何找到原因?
- 20. 任何想法的原因可能會導致一些Android手機凍結
- 21. Coldfusion和mySQL - 尋求一般和異地備份策略的推薦
- 22. 隨機斷點未知的原因
- 23. 如何將隨機策略與Q值迭代相結合?
- 24. 無法找到TabBar上隨機崩潰的根本原因
- 25. arduino網頁客戶端隨機凍結
- 26. Python多線程凍結(?)隨機
- 27. 串口工作線程凍結隨機
- 28. 仿真程序隨機凍結
- 29. objc_setAssociatedObject中的原子策略
- 30. + 1的一般策略/喜歡在一個網站
+1爲「窮人的調試」。 – 2009-12-03 17:41:06
這個問題被標記爲「語言不可知」,所以我不想對平臺或工具做任何假設。儘管所有糟糕的新聞,你可以用printf()和一些聰明的東西走很長的路。 – 2009-12-09 13:16:58