软件常见崩溃的原因:
错误类型 | 具体表现 | 备注(案例) |
声明错误 | 变量未声明 | 编译时错误 |
初始化错误 | 未初始化或初始化错误 | 运行不正确 |
访问错误 | 1、 数组索引访问越界 2、 指针对象访问越界 3、 访问空指针对象 4、 访问无效指针对象 5、 迭代器访问越界 6、dll与lib及头文件不一致 7、dll 导出接口定义为导入接口 | WinDbg,Application verifier,Global flags等工具定位崩溃 |
内存泄漏 | 1、 内存未释放 2、 内存局部释放 3、 多线程读写成员变量 | |
参数错误 | 本地代理、空指针、强制转换 | |
堆栈溢出 | 调用堆栈溢出: 1、递归调用 2、循环调用 3、消息循环 4、大对象参数 5、大对象变量 | 参数、局部变量都在栈(Stack)上分配 |
转换错误 | 有符号类型和无符号类型转换 | |
内存碎片 | 小内存块重复分配释放导致的内存碎片,最后出现内存不足 | 数据对齐,机器字整数倍分配 |
解决办法:
1.使用日志,这个比较常见就不做说明
2.使用windbg,具体参照windbg使用说明
3.使用Application verifier或者Global flags ,具体参照verifier使用说明
windbg与Application verifier,Global flags安装包地址:windbg_appVerifier_globalFlags.rar-C++文档类资源-CSDN下载
安装完之后这几个exe不在同一个目录。
windbg使用说明:
windbg通常用于定位逻辑上的错误
1,发表软件时,设置生成调试信息(vs环境,项目属性-》链接器-》调试信息-》生成调试信息以及生成程序数据库文件(pdb文件))
2, 软件中添加生成dump文件的代码(可自行百度)。
3,打开windbg 添加pdb路径,加载dump文件,有源码的可添加源码路径。以上三个动作均在file菜单栏。
4,打开windbg view-》comand 输入:!analyze,分析崩溃原因,紧接着输入kv或者直接点击view->call stack,查看崩溃时的堆栈信息。
dll与lib 头文件不一致,dll export接口定义为import等引起的崩溃,具体表现为定位到的崩溃地址的源代码明显不会引起崩溃,此时只能人为排查。笔者曾将dll定义的导出接口设为了导入接口,调用dll时使用的动态调用(神奇的成功运行),然后软件不时的崩溃。最终历经四天终于一步步排查到这个问题。
Application verifier使用说明:
verifier通常用于定位堆栈溢出,内存泄漏。当使用windbg定位到的崩溃位置明显不会崩溃时,此时要考虑堆破坏,内存越界,这两种会时崩溃发生延时崩溃发生偏移。考虑到这种情况windows的Page Heap应运而生,具体内容可自行搜索。verifier则是微软提供工具。
1.打开Application verifier左侧右键添加要监控的exe
2.有侧选择basic 中的heap(也可以监控内存泄漏等问题),点击保存
3.打开log对话框,设置pdb文件路径,当软件产生异常时,打开日志定位到越界的具体位置
4.在win7运行当发生内存越界时,使用vs调试时软件会立即进入中断。win10时,发生越界时不会理解中断,会在释放内存时发生中断。
软件常见崩溃的原因:
错误类型 | 具体表现 | 备注(案例) |
声明错误 | 变量未声明 | 编译时错误 |
初始化错误 | 未初始化或初始化错误 | 运行不正确 |
访问错误 | 1、 数组索引访问越界 2、 指针对象访问越界 3、 访问空指针对象 4、 访问无效指针对象 5、 迭代器访问越界 6、dll与lib及头文件不一致 7、dll 导出接口定义为导入接口 | WinDbg,Application verifier,Global flags等工具定位崩溃 |
内存泄漏 | 1、 内存未释放 2、 内存局部释放 3、 多线程读写成员变量 | |
参数错误 | 本地代理、空指针、强制转换 | |
堆栈溢出 | 调用堆栈溢出: 1、递归调用 2、循环调用 3、消息循环 4、大对象参数 5、大对象变量 | 参数、局部变量都在栈(Stack)上分配 |
转换错误 | 有符号类型和无符号类型转换 | |
内存碎片 | 小内存块重复分配释放导致的内存碎片,最后出现内存不足 | 数据对齐,机器字整数倍分配 |
解决办法:
1.使用日志,这个比较常见就不做说明
2.使用windbg,具体参照windbg使用说明
3.使用Application verifier或者Global flags ,具体参照verifier使用说明
windbg与Application verifier,Global flags安装包地址:windbg_appVerifier_globalFlags.rar-C++文档类资源-CSDN下载
安装完之后这几个exe不在同一个目录。
windbg使用说明:
windbg通常用于定位逻辑上的错误
1,发表软件时,设置生成调试信息(vs环境,项目属性-》链接器-》调试信息-》生成调试信息以及生成程序数据库文件(pdb文件))
2, 软件中添加生成dump文件的代码(可自行百度)。
3,打开windbg 添加pdb路径,加载dump文件,有源码的可添加源码路径。以上三个动作均在file菜单栏。
4,打开windbg view-》comand 输入:!analyze,分析崩溃原因,紧接着输入kv或者直接点击view->call stack,查看崩溃时的堆栈信息。
dll与lib 头文件不一致,dll export接口定义为import等引起的崩溃,具体表现为定位到的崩溃地址的源代码明显不会引起崩溃,此时只能人为排查。笔者曾将dll定义的导出接口设为了导入接口,调用dll时使用的动态调用(神奇的成功运行),然后软件不时的崩溃。最终历经四天终于一步步排查到这个问题。
Application verifier使用说明:
verifier通常用于定位堆栈溢出,内存泄漏。当使用windbg定位到的崩溃位置明显不会崩溃时,此时要考虑堆破坏,内存越界,这两种会时崩溃发生延时崩溃发生偏移。考虑到这种情况windows的Page Heap应运而生,具体内容可自行搜索。verifier则是微软提供工具。
1.打开Application verifier左侧右键添加要监控的exe
2.有侧选择basic 中的heap(也可以监控内存泄漏等问题),点击保存
3.打开log对话框,设置pdb文件路径,当软件产生异常时,打开日志定位到越界的具体位置
4.在win7运行当发生内存越界时,使用vs调试时软件会立即进入中断。win10时,发生越界时不会理解中断,会在释放内存时发生中断。