1. 程式人生 > >深入全面探究有未經處理的異常: 0xC00000FD: Stack overflow(棧溢位)問題!

深入全面探究有未經處理的異常: 0xC00000FD: Stack overflow(棧溢位)問題!

這兩天一直遇到標題上的問題,我相信很多朋友在執行程式碼的時候都會遇到這樣的問題,我在網上也找了很多的資料解決這個問題,雖然有些方法能解決,但是總覺得總結的不是很全面,這裡我自己在相對全面的總結一下,如果有不對的地方還請各位看官指正。

 

首先要交代一下背景情況,我執行的這段程式碼是別人寫的,這段時間是我一直在維護,因為平臺不一樣,所以讀庫的方式不一樣,我先在liunx的環境下編譯了程式,執行都沒有問題,可以按照我介面的方式讀到資料庫的資料。但是我用vs2010的window環境下編譯的時候就出現了以下圖片的問題。

 

字面上翻譯過來的話就是:棧溢位了。

意思就是你分配的記憶體太小了,而你程式中有的資料太大,這裡導致了棧溢位的情況。

於是我就在網上找資料來查詢這個問題,一搜一大堆。

 

 

其中普遍的解決方式就是在   屬性-》連結器-》系統-》堆疊保留大小和堆疊提交大小  中將資料增加,我這裡將這兩個數值都改成了16000000。如下圖所以:

 

程式確實是可以執行起來了,但是我在想一個問題,一般我們程式都是使用的預設值,出現這樣的問題歸根到底的原因是什麼呢?

其實還是回到我上面說到的那個問題 堆疊溢位了,vs在程式啟動的時候一般分配的堆疊大小是1M的空間,如果你的全域性變數或者靜態變數有很大的值的話,這裡就會出現這樣的堆疊溢位的問題。

於是我就在程式碼裡面找是否有較大資料的全域性變數,發現了一個巨集定義如下圖所示:

 

這個巨集定義一下就是1M了,加上其他的一些定義,肯定就超過了1M,如果你是在DEBUG的情況下去除錯程式的時候,你會發現連主函式都進不去,因為有全域性變數在主函式執行之前就已經棧溢位了,就好像下面這種情況,斷點無效。

 

但是領導那邊的要求是程式必須通過命令列的方式編譯也要通過,因為客戶那邊只會操作命令列。

操作命令不難就是在有pro檔案的情況下在命令列輸入qmake,生成了makefile檔案,再執行nmake,生成可執行檔案。那麼問題來了我用這種方式也執行成功了,也生成了可執行檔案exe,但是當我雙擊exe的時候程式並沒有起來,而且沒有任何列印資訊,這裡我想到了可能還是這個棧溢位的問題,pro檔案中應該也需要設定一下上面提到的堆疊保留大小和堆疊提交大小。那麼在pro檔案中如何去設定這兩個量呢?

在pro檔案中新增上以下兩個量就可以了:

 

QMAKE_CXXFLAGS += /F 16000000
QMAKE_LFLAGS   += /STACK:16000000

 

這個設定跟vs2010上面的設定是一樣的,當然大小自己可以定的,我這裡還是設定的大小為16000000。

 

最後總結:

其實把問題都真正弄清楚了再會看一點都不難,但是在處理的過程中感覺還是比較費勁兒的,所有的提示都是比較精準的,最後找其原因還是回到了最本質的問題,我建議的話還是儘量將全部變數的大小設定的小一點,1024*1024就有點大了,我維護的這段程式碼並不是我寫的,所以我還是準從開發的意願吧。

希望這邊文章對大家還是有所幫助 謝謝!!!

&n