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