案例一:
2009.11月某日的案例 StereoCamera項目
(某個全域對象初始化的時候,memset越界導致堆錯誤導致的)
很奇怪的問題。 周五臨下班時,發StereoCamera.dll的版本。
從vss上down下最新的代碼,編譯,串連,運行,!!!應用程式正常初始化失敗! faint!換了放到pc目錄下,也是失敗。
單步調試吧,還沒進入main()函數之前就提示 應用程式正常初始化失敗! 看來原因應該出現在進入main函數之前的代碼,也就是在執行某些全域變數建構函式的時候,接著尋找,發現問題出現在Trace()的建構函式裡,因為StereoCamera的建構函式裡構造了 Trace對象,而StereoCamera是個全域的靜態變數。
接著定位,定位到了 malloc2d函數,但是,從崩潰現場來看,代碼的邏輯每一點問題,malloc的記憶體也不是很大,怎麼會失敗呢?
出錯地方類似於下面的代碼 new int[10], new跑出了 bad_alloc 異常。
從邏輯上分析,應該不是記憶體不足的問題,因為通過工作管理員查看也沒有什麼問題。
難道是全域變數的初始化裡不應該執行太多的new操作?(也就是在進入main之前不能執行太多的malloc操作?)試著把夠著函數裡面的new Trace代碼移到了普通成員函數裡,測試,還是不行。
看來這問題比較複雜。無奈代碼不是自己寫的。哎。
最後找來代碼原作者,發現問題,某個memset的時候記憶體越界,這導致破壞了系統的記憶體,導致了bad_alloc
案例二:
2009.11月某日的另一個案例。Led_Calibration項目
(沒有使用原始版本的sln解決方案檔案檔案導致)
之前一直在筆記本下,現在使用台式機後,很多代碼都需要從vss上down下來。
今日down了最新的 Led_Calibration代碼,刪除掉sln解決方案,自己建了一個解決方案,然後編譯、運行,彈出:應用程式初始化失敗!奇怪,之前都好好的程式會失敗!
而且vc2005提示 該進程載入的某個dll中存在堆錯誤,導致載入失敗!
鬱悶,然後換了小趙電腦,從新down下vss上的代碼,這次沒有刪掉sln,直接使用vss上down下的sln(雖然sln檔案你直接雙擊打不開,但是可以先開啟vc2005然後把sln檔案拖進來),編譯,運行,OK!
我靠,好奇怪的問題哦。 然後回到自己的台式機上,down下vss上的sln檔案,編譯、運行,我靠,也好了!
你說怪不怪? 而且當初vc2005還像模像樣的給我提示某個dll存在對錯誤。真是莫名其妙。
案例三:
重寫了tsGUI的部分介面,然後寫了一個test控制台測試案例。一直用著好好的,可是突然某一次編譯運行就不行了,怪了 tsGUI我也沒改啥啊,就算改動也是在正常範圍之內啊。
出錯提示:
windows 已在 test.exe 中觸發一個斷點。
其原因可能是堆被破壞,這也說明 test.exe 中或它所載入的任何DLL 中有 Bug。
輸出視窗:
test.exe 中的 0x7c92e470 處最可能的異常: 0xC0000005: 讀取位置 0x00000130 時發生存取違規
R6034
An application has made an attempt to load the C runtime library without using a manifest.
This is an unsupported way to load Visual C++ DLLs. You need to modify your application to build with a manifest.
For more information, see the "Visual C++ Libraries as Shared Side-by-Side Assemblies" topic in the product documentation.
Windows 已在 test.exe 中觸發一個斷點。
其原因可能是堆被損壞,這也說明 test.exe 中或它所載入的任何 DLL 中有 bug。
#if defined (_CRT_CHECK_MANIFEST)<br /> if (!_check_manifest(hDllHandle))<br /> {<br /> __try<br /> {<br /> _NMSG_WRITE(_RT_CHECKMANIFEST);<br /> }<br /> __except( EXCEPTION_EXECUTE_HANDLER )<br /> {<br /> OutputDebugString(_GET_RTERRMSG(_RT_CHECKMANIFEST));<br /> DebugBreak();<br /> }</p><p> _ioterm(); /* shut down lowio */<br /> _mtterm(); /* free TLS index, call _mtdeletelocks() */<br /> _heap_term(); /* heap is now invalid! */<br /> return FALSE;<br /> }<br />#endif /* defined (_CRT_CHECK_MANIFEST) */
通過看提示,看崩潰點,好像是manifest的問題,修改項目屬性 清單工具 - 常規 - 使用fat32解決方案 重新編譯OK。