2009-06-25 111 views
4

我們發現我們的一個自動生成的程序集在new()上拋出StackOverflowException。這個類有(請隨我)400個簡單的屬性被初始化(大部分是默認的(字符串)等)在構造函數中。如何更改託管executable.net的默認堆棧大小

我們注意到它在64位上很好,但是在32位上它很棒!

我們需要測試我們的用例是否合理,以創建一個更大的默認堆棧,以便在重新構造代碼生成器時爲我們提供呼吸空間。

我們會特別的。如果可能的話,對涉及app.config的解決方案感興趣。但我是一個現實主義者,所以一切都會很好。

堆棧溢出的重要原因。我們已經縮小了相關構造函數的錯誤。我的第一印象也是無限遞歸的類型。然而,我們使用3線控制檯應用程序再現了錯誤:

  • 創建類的空實例。
  • 在第一份工作要創建的類上調用一個非靜態方法(克隆),並且清空實例已準備好將這些屬性傳入。

它碰到第二個構造函數時會發生爆炸。

現在使用.net源代碼進行調試時,我們看到堆棧溢出位於Guid.NewGuid()中,它作爲第二個參數傳遞給構造函數。實際的代碼行是對本地CoCreateGuid()調用的調用。

所以,雖然它可能是CoCreateGuid()中的一個錯誤,但我們希望從問題中消除我們的代碼。我的第一個想法是大量增加堆棧的大小,並查看是否再次出現此錯誤。然後,因爲我認爲我們可以控制所有用例,所以用對象初始化替換構造函數 - 認爲這可以減輕堆棧上的壓力。

Nb。我們可以通過從類中刪除int屬性來阻止錯誤發生。

+1

好的,所以我投了票,沒有看到在http://stackoverflow.com/questions/1042347/how-do-you-change-default-stack-size-for-managed-executable上的建議重複。對於那個很抱歉。既然這一個實際上已經得到了回答,而另一個則沒有,我認爲我們應該讓這個開放並關閉另一個。 – 2009-06-25 05:58:41

+0

哎呀複製是一個瀏覽器口吃的情況下真正點擊回想我想添加更多的信息 - 但顯然它張貼。 – 2009-06-25 09:32:15

回答

2

您可以use editbin更改可執行文件的堆棧大小。就我所知,您無法在app.config中執行此操作。

另一個選項(在該頁面上也提到)是創建一個具有「正確」堆棧大小的新線程。該頁面提到了這種方法的優缺點。

我會感到驚訝,如果只設置在構造400點的屬性是雖然問題的原因......這將是一個堆棧幀 - 但除非你有幾個堆棧幀在堆棧上,我預計它會好起來的。另一種可能是,你有什麼地方無限遞歸:)

編輯:另外一個建議......

想必你在這個構造有很多的局部變量? (否則它不應該佔用比任何其他調用更多的堆棧。)是否可以將構造函數分成多個方法,爲每個方法設置(比如說)20個字段?如果這些字段是隻讀的,那將是棘手的。

如果您可以告訴我們構造函數是什麼樣子,那會有很大的幫助。您可能還想使用ildasm來查看它聲明該構造函數的堆棧大小。

只是爲了檢查,這一個類而不是結構,對吧?