windows系统软件崩溃分析

软件常见崩溃的原因:

错误类型

具体表现

备注(案例)

声明错误

变量未声明

编译时错误

初始化错误

未初始化或初始化错误

运行不正确

访问错误

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时,发生越界时不会理解中断,会在释放内存时发生中断。


   

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值