C++程序异常时怎么处理

15 篇文章 0 订阅
9 篇文章 0 订阅

程序崩溃定位以及准备

如何定位程序异常

1. 文档说明

 
  1. 主要是针对Windows下的程序崩溃异常,以下是结合实际经验以及借鉴网上的参考,得出的小结,具有一定实际意义。

2. 分析说明

 
  1. 程序运行时异常崩溃无法避免,需要快速定位以下几个情况:
  2. 1.必现的崩溃异常,直接用VS进行调试运行,加断点调试,崩溃时ALT+2查看堆栈。
  3. 2.对于实际运行中的异常,不好直接定位,需要我们结合实际情况提前做好准备和分析。

3. 解决思路

 
  1. 主要针对第2种情况比较复杂,参考以下,在《Windows核心编程》中有部分参考:
  2. 1. 崩溃时,添加回调函数,来进入具体的异常处理代码段;
  3. 2. 在注册的回调函数中,输出崩溃的详细信息(堆栈信息等);
  4. 3. 结合工程输出的MAP文件,参考内存地址找到崩溃的函数;

4. 具体操作

4.1 注册异常处理函数

 
  1. 用SetUnhandledExceptionFilter注册自定义的错误处理回调函数,打印出崩溃时候的异常堆栈信息。
  2. 可以参考网络教程;

4.2 输出崩溃信息

4.2.1 回调函数原型:

 
  1. typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)(
  2. __in struct _EXCEPTION_POINTERS *ExceptionInfo
  3. );
  4. 返回值:EXCEPTION_CONTINUE_EXECUTION – 错误已经被修复,从异常发生处继续执行
  5. EXCEPTION_CONTINUE_SEARCH – 继续查找异常过滤器
  6. EXCEPTION_EXECUTE_HANDLER – 正常返回
  7. 参数: 崩溃信息结构,包含崩溃原因、崩溃模块、崩溃地址、崩溃堆栈等;

4.2.2 结构体信息

 
  1. 关键是这个结构体,详细定义可以参考网络教程
  2. typedef struct _EXCEPTION_POINTERS {
  3. PEXCEPTION_RECORD ExceptionRecord;
  4. PCONTEXT ContextRecord;
  5. } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

4.3 编译生成map文件

 
  1. 以VS2010为例
  2. 生成的文件

4.4 结合堆栈信息分析

 
  1. 根据出错的内存地址,在MAP文件中,大致推算出运行的堆栈信息,结合具体的代码段分析

 

5. 个人总结的常用几个错误

     

0xc0000005

 

需要注意以下几点:

无效的参数错误,我在工作中可能的原因有:

1. sprintf_s失败,后目的字符串变成NULL,归根到底还是长度要注意限制;比如我常这样用

 

sprintf_s(strPrintf,len*4+10,"心跳数据:UID=%s,Data=%s",heart_date.myUID,orgData);
Server_Log(strPrintf);
需要注意,当输入的字符串大于strPrintf字符串长度时,sprintf_s会报此错误,同时返回的字符串是空,该异常可以用_setexceptionhandle捕捉;
 
 
 
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShaYQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值