2012-10-01 132 views
0

可能重複:
How do I prevent and/or handle a StackOverflowException? (C#)
C# catch a stack overflow exception捕捉堆棧溢出異常C#

我有(使用.NET 2.0)C#編寫的一個相當複雜的應用程序。該程序以大量遞歸的方式處理大量文件,並且在某些客戶端中它會遇到堆棧溢出異常。該計劃非常複雜,我們甚至無法重現問題 - 即使是在我們的客戶發生的地方。

顯而易見的解決方案是修復導致堆棧溢出但看起來不太可能的代碼 - 我們的代碼庫超過200萬行代碼,在內存中創建大型遞歸數據結構。我們不太可能偶然發現問題部分。 (無論如何,不​​是在短期內。)

但是,我們的程序還備份文件並對正在處理的文件進行更改,如果出現異常,它會將所有內容恢復到原始狀態。當堆棧溢出異常發生時,進程只是終止,並且此恢復功能沒有機會運行,因爲無法捕獲堆棧溢出。

所以我的問題是:有沒有辦法在.NET 2.0中捕捉堆棧溢出異常。我無法託管CLR,並且異常是真正的堆棧溢出,而不是由我們的代碼拋出。能夠做到這一點至少會讓我有能力恢復程序終止前所做的更改。

編輯:請注意,我很清楚堆棧溢出異常是什麼,它有多嚴重。我不是在尋找建議 - 這種情況很少發生。我想要做的是在磁盤空間有限的環境中恢復客戶端數據它發生。如果我的程序在恢復操作後死亡,那我就沒問題。

+0

你可以發佈一個當前正在使用的代碼示例嗎?或許你只是遇到了一個簡單的邏輯錯誤或內存泄漏問題 – MethodMan

+0

一旦你發現了一個SO異常,你打算做什麼?你將如何從它恢復? –

+0

@DJKRAZEno,沒有特定的代碼。我們正在討論一個包含250多個組件的大型應用程序。我不想找到堆棧溢出 - 我正在尋找一種方法來捕獲它並對其做出反應。 – xxbbcc

回答

0

聽起來好像你在說,我有一個修改文件的進程,如果發生錯誤,它應該恢復文件,但它沒有這樣做。

如果這是相同的,爲什麼不使用臨時文件,並且操作是否完成使用臨時文件覆蓋源文件。如果發生任何未捕獲的異常,則您有原始文件(原文不變)。

+0

我們不這樣做的原因是因爲有時我們必須處理的文件很大,並且全部支持它們可能會佔用所有磁盤空間。 (並不總是,每隔一段時間 - 我們都在談論不同的客戶端和不同的文件集。)我們備份我們修改的文件,並在出現問題時嘗試恢復文件的所有更改。 – xxbbcc

+0

這很有趣,因爲從編程的角度來看,編程來解決這個問題將會佔用更多的驅動器空間(99.998%)。 –

+0

我們的進程經常在磁盤空間有限的虛擬機內部運行 - 這就是我們必須小心的原因。 – xxbbcc

0

我不推薦這樣做,但是您可以使用/F Compiler Switch來設置編譯區塊的堆棧大小。默認值是1MB。 雖然這不是一種「修復」代碼的好方法,但它會阻止那些令人討厭的Stack Overflow消息。

+0

我不認爲這會工作我們的代碼運行到真正的堆棧溢出 - 無論我們分配多少堆棧,它最終都會耗盡。正確的解決辦法是找出原因,但正如我所說的,代碼非常龐大而且非常複雜,所以暫時我想首先處理更緊迫的問題。 – xxbbcc

+0

指向/ F編譯器開關的鏈接用於C/C++編譯器。我找不到C#的編譯器選項,但如果它是您創建的線程,則可以在線程構造函數http://msdn.microsoft.com/en-us/library/5cykbwz4.aspx中指定它。 –

+0

@DavidYaw - 你是對的。這是針對C++的。在C#中,就像你說的,你可以在Thread構造函數中設置堆棧大小。 – Icemanind