2009-11-27 92 views

回答

4

如果幸運的話,您可以在調試器中運行您的代碼直到它凍結,然後停止調試器以查找有問題的代碼行。但如果這很容易,你可能不會徵求建議。 :-)

可以一起使用的兩種策略是「分而治之」和「留下面包屑」。

分而治之:註釋掉越來越大的部分代碼。如果它仍然凍結,你已經減少了可能導致凍結的代碼量。 注意:最終你會註釋掉一些代碼,程序將而不是凍結。這並不意味着代碼的最後一位必須是負責凍結;這只是不知何故涉及。把它放回去並註釋掉別的東西。

假面包屑:讓你的程序告訴你它在哪裏以及它在執行時的功能。顯示消息,添加到日誌文件,發出聲音或通過網絡發送數據包。您預期的執行路徑是什麼?它在凍結之前做的最後一件事是什麼?再次,請注意,最後一條消息可能來自與負責凍結程序的消息不同的線程,但當您更接近原因時,您將調整代碼記錄的內容和位置。

+0

+1爲「窮人的調試」。 – 2009-12-03 17:41:06

+0

這個問題被標記爲「語言不可知」,所以我不想對平臺或工具做任何假設。儘管所有糟糕的新聞,你可以用printf()和一些聰明的東西走很長的路。 – 2009-12-09 13:16:58

1

我會安裝UserDump工具,follow these instructions生成的應用程序的用戶轉儲....

一旦你的用戶轉儲,您可以使用WinDbg或CDB檢查線程,棧,和鎖等。

我經常發現掛起是由鎖定的互斥鎖或類似的東西造成的。

2

當你不應該的時候,你可能在UI線程中做了些什麼。

+0

+1'occams'triage':) – 2009-11-27 23:26:44

+0

這可能是可能的。有什麼方法可以更好地查明確切原因? – 2009-11-28 11:31:21

5

如果您想從正在運行的應用程序之外進行檢查,那麼我可能會使用Mark Russonivich的sysinternals.com工具集,perfmon工具允許您跟蹤文件/註冊表訪問並檢查跟蹤延遲 - 以及正在被訪問。它將顯示當時的DLL調用堆棧,正確的符號可用於調試導致延遲的應用程序外部的問題。 (我用它來發現一個與安全套件相關的I/O過濾器是一個應用程序嘎嘎了1.5秒延遲的原因。)

+0

同意安德魯。 Sysinternals工具是識別應用程序凍結的堆棧的一部分的最簡單且最快速的方式 – 2009-11-27 23:49:49

0

好的一般策略是,運行程序直到它掛起。然後附加一個調試器,看看發生了什麼。在一個GUI程序中,你最關心的是UI線程正在做什麼。

你說應用程序掛起IDE。這不應該發生,我想這意味着程序正在給整個系統掙扎的操作系統(可能是CPU負載或內存)帶來很大的壓力。

嘗試運行它直到它掛起,返回到IDE,然後單擊「停止」按鈕。你可能必須非常耐心。如果IDE真的永久停留,那麼您必須提供有關您的情況的更多詳細信息以獲得有用的幫助。