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

  • 2019 年 10 月 31 日
  • 筆記

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

 

首先要交代一下背景情況,我執行的這段程式碼是別人寫的,這段時間是我一直在維護,因為平台不一樣,所以讀庫的方式不一樣,我先在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就有點大了,我維護的這段程式碼並不是我寫的,所以我還是准從開發的意願吧。

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