解決stack overflow棧溢出問題!

來源:互聯網
上載者:User

今天又遇到"stack overflow"的問題,讓我和一個同事頭痛了好半天。

問題描述:VC++寫的COM模組(ATL),用Delphi做用戶端調用,運行時報"stack overflow"的錯誤,調試發現此錯誤是在執行COM中一個函數入棧的時候發生的。

棧溢出!乍一眼還覺得挺嚇人的,沒什麼經驗,是頭一次遇到這樣的問題。堆棧的知識我不是很懂,只知道要執行的東西先要壓入棧中,既然報了溢出,就說明東西太大了,容器裝不下了。那到底是什麼東西太大了呢?看來看去突然發現,這個出問題的函數一共寫了有1000多行,天啦!

把函數體拆分開!當時首先是這樣想的,但馬上發現,不好拆,因為整個函數體裡就是一個大大大大大的switch...case...分支流程,要是把每個case下的內容拆出來單獨寫成函數再調用,這個工作量太大。還是先想想其它出路……

東西大了,從另一面來講不就是容器(棧)小了嗎?不把這個東西變小,如果能把容器變大也應該能解決吧!要把棧變大,於是開啟菜單Project(項目)->XXX Property(屬性),在Linker(連結器)->System(系統)裡找到Stack Reserve Size(堆棧保留大小)和Stack Commit Size(堆棧提交大小)兩個選項,馬上把這兩個值設定成足夠大,測試——結果依然報錯。-_- !

繼續思考,發現在調試時,錯誤訊息是直接彈出來的,而VS的調試環境並沒有事先捕獲到。因為是用Delphi的程式在調用COM,那這樣看來,應該到Delphi中去找找原因。同樣,找到Project->Options->Linker->Max stack size,把這個值改大一些。果然!運行成功沒有報錯了!再回到VS把剛才改過的兩處設定改回原預設值,仍然沒有報錯,看來瓶頸問題出在Delphi上。

以上小小心得,探究問題與解決問題的思路,自己做個筆記,也求與大家分享!

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.