最近將代碼調(diào)整為release版時(shí),碰到這樣一個(gè)奇怪的錯(cuò)誤:直接運(yùn)行程序,還沒有進(jìn)入main入口時(shí)就宕掉。這個(gè)exe工程鏈接過一個(gè)公用的靜態(tài)庫和一個(gè)底層功能的靜態(tài)庫。在debug版完全沒有問題。
隨即開始隔離代碼分析,當(dāng)隔離到一個(gè)繼承公用靜態(tài)庫時(shí),隔離后不會(huì)宕機(jī)。這表示靜態(tài)庫與exe之間的鏈接出了一些問題。再次觀察掛掉的地方顯示streambuf一類的東西,這是包含在iostream里的東西,繼續(xù)點(diǎn)擊堆棧向上跟蹤。結(jié)果在wcout.cpp里發(fā)現(xiàn)了
__PURE_APPDOMAIN_GLOBAL static wfilebuf wfout(_cpp_stdout);
所有問題迎刃而解,應(yīng)該是惡心的iostream的靜態(tài)變量,在多重靜態(tài)庫鏈接時(shí)的錯(cuò)誤,導(dǎo)致exe啟動(dòng),CRT為其分配內(nèi)存時(shí)的宕機(jī)。馬上屏蔽所有使用過wcout及iostream的所有代碼。release版正常運(yùn)行,不再宕機(jī)