C++ 常見崩潰問題分析
http://blog.csdn.net/kyfvc/article/details/7185365
一、前言
從事自動化測試平台開發的編程實踐中,遭遇了幾個程序崩潰問題,解決它們頗費了不少心思,解決過程中的曲折和徹夜的輾轉反側卻歷歷在目,一直尋思寫點東西,為這段難忘的經歷留點紀念,總結慘痛的教訓帶來的經驗,以期通過自己的經歷為他人和自己帶來福祉:寫出更高質量的程序;
由於 C 和 C++ 這兩種語言血緣非常近,文本亦對 C 編程語言有借鑒作用;
二、C++ 崩潰分類
一切的偶然並非偶然 |
在編程實踐中,遭遇到了諸如內存無效訪問、無效對象、內存泄漏、堆棧溢出等很多C / C++ 程序員常見的問題,最后都是同一個結果:程序崩潰,為解決崩潰問題,過程都是非常讓人難以忘懷的;
可謂吃一塹長一智,出現過幾次這樣的折騰后就尋思找出它們的原理和規律,把這些典型的編程錯誤一網打盡,經過系統性的分析和梳理,發現其內在機理大同小異,通過對錯誤表現和原理進行分類分析,把各種導致崩潰的錯誤進行歸類,詳細分類如下:
錯誤類型 |
具體表現 |
備注(案例) |
聲明錯誤 |
變量未聲明 |
編譯時錯誤 |
初始化錯誤 |
未初始化或初始化錯誤 |
運行不正確 |
訪問錯誤 |
1、 數組索引訪問越界 2、 指針對象訪問越界 3、 訪問空指針對象 4、 訪問無效指針對象 5、 迭代器訪問越界 |
|
內存泄漏 |
1、 內存未釋放 2、 內存局部釋放 |
|
參數錯誤 |
本地代理、空指針、強制轉換 |
|
堆棧溢出 |
調用堆棧溢出: 1、遞歸調用 2、循環調用 3、消息循環 4、大對象參數 5、大對象變量 |
參數、局部變量都在棧(Stack)上分配 |
轉換錯誤 |
有符號類型和無符號類型轉換 |
|
內存碎片 |
小內存塊重復分配釋放導致的內存碎片,最后出現內存不足 |
數據對齊,機器字整數倍分配 |
其它如內存分配失敗、創建對象失敗等都是容易理解和相對少見的錯誤,因為目前的系統大部分情況下內存夠用;此外除0錯誤也是容易理解和防范;
C++記錄程序崩潰時的dumpfile
http://anfernee.blog.51cto.com/4828774/994536
C++程序崩潰生成dump
http://blog.csdn.net/whatday/article/details/44857921