2012-09-20 134 views
1

我有截止日期。我是googling,我代碼閱讀,我neeed幫助...如何縮小堆棧溢出異常?

我的應用程序正在扔EStackOverFlow。它需要通宵測試才能發現錯誤,所以我需要一些好點子,否則需要花費很長時間來追蹤。

我昨天晚上用MAD試了一下,但是沒有看到它,大概是因爲沒有堆棧可以這麼做。我從IDE開始運行,因此我打破了執行過程並查看了Call Stack,但除了詳細信息(我已聯繫作者,但我們之間存在很大的時間差異)之外,它充滿了MAD。

沒有(故意)遞歸遞歸例程。沒有OnChange處理程序(可能會意外更改它們監視的組件,從而遞歸地調用它們自己)。沒有大數據結構(可能作爲參數在堆棧上傳遞)。

我的第一個想法是關閉MAD除外,但我不能再等待12或16個小時發生崩潰。

無人值守,當計時器每隔30秒或每小時過期時,程序正在做一些數據庫訪問,所以我將這些設置爲1秒,希望能夠加速崩潰。嗯,我可以縮小堆棧大小以加快崩潰嗎?如果是這樣,怎麼樣?

我還能做什麼?我已經在Try ...中包裝了我的應用程序主文件,其中創建了表單並運行了應用程序。

是否有某些問題,如消息處理循環,我可以檢查堆棧大小,看看它是否增長「太大」? (如果是這樣,你能否提供細節?)

其他建議?在此先感謝

(頁代碼太大,無法發佈)

+1

您可以在鏈接器選項(或$ MAXSTACKSIZE)(對於可執行文件)中設置最大堆棧大小。 –

+0

+1我已將其設置爲允許的最小值。對於XE2,這是65536.我希望問題現在會更早發生。 – Mawg

+1

查看類中的「數組類型」字段並搜索「While」和「repeat」循環,這是我在過去發現的大多數問題的地方...... – ComputerSaysNo

回答

1

AS。我上面提到的Profiler方法可能會給你帶來純粹運氣的結果(如果有一些雜散分支會導致你發生罕見的即時快速泄漏,說100個病例中只有一個會導致無限遞歸)。但是,如果存在穩定的累積泄漏,需要整夜進行累積,那麼探查器結果與正常工作無法區分。

我想了一下。目前的假設是堆棧跟蹤器因沒有堆棧而失敗。讓我們來堅持下去。那麼我們會在堆棧結束之前拋出異常,是的?所以我會嘗試這個序列:

1)我會設置堆棧跟蹤記錄完整的堆棧跟蹤包括行號。它可以在Delphi IDE使用的JCL追蹤器中完成,我認爲madExcept也可以。

2)我想知道當前的堆棧大小。例如Determining Stack Space with Visual Studio

3)我會定期檢查使用的堆棧空間。例如What is a safe Maximum Stack Size or How to measure use of stack?

注意:因爲我們幾乎不知道哪個線程導致了這種情況 - 如果我有幾個線程,我會嘗試使用所有這些線程。我只是不知道應用程序會如何反應,如果一些輔助線程失敗與SO,它可以被截獲並記錄或整個應用程序將被炸燬只是一個線程

4)〜每5分鐘我會記錄當前的堆棧使用情況 - 僅查看模式,是否正在穩步慢慢挖掘,還是一些罕見但嚴重的代碼路徑。 如果多個線程 - 然後幾個日誌文件每個線程一個 它也可以允許估計「正常」的堆棧使用情況。如果堆棧使用率提高到80%以上(我認爲你的「正常」用法todl以上不會超過它,不是嗎?)我會提出手動異常,一些特殊的類,不會被捕獲,直到線程/應用程序頂層,甚至可能做一些複雜的事情,比如將應用程序暫停爲調試器並喚醒你,這樣你就可以遠程連接並檢查病態但尚未死亡的應用程序的內部狀態。

1

最常見的stackoverflow問題是函數調用自己,儘量避免它,或者至少限制它。

你說你使用計時器,你是否在你的計時器事件中調用Application.ProcessMessages?如果你在隊列中有很多消息,如果它有另一個WM_TIMER,則可能會導致計算器溢出。