C++随机崩溃捕捉处理

摘要:
}catch(inte){cout<}voidmain(){SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);

1. 会引起异常的几个原因(主要记录目前遇到过的几个问题)

  • 程序读取了无效的内存地址
  • 堆栈的溢出,比如无限循环导致那段内存溢出,比如把size为20的缓存拷贝到size为10的缓存块等
  • 无法申请到有效的内存
  • 多次删除同一块内存

2. 异常处理

2.1 SEH(Structured Exception Handling)

SEH是C语言的异常处理方法,主要使用如下方法处理异常,这个一般用于主动防御性代码中

try
{
    throw 20;
}
catch (int e)
{
    cout << "An exception occurred. Exception Nr. " << e << endl;
}

工作中我们应该会经常遇到随机,未知的异常崩溃,所以SEH提供了另一种方法处理异常

LONG WINAPI MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionPtrs)
{
  // Do something, for example generate error report

  //..

  // Execute default exception handler next
  return EXCEPTION_EXECUTE_HANDLER; 
}

void main()
{ 
  SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);  //< 一定要main程序开始后就注册异常处理函数

  // .. some unsafe code here 
}

2.2 CRT Error Handling(运行时异常)

运行时发生异常时,C++会调用terminate(),所以我们可以使用set_terminate捕获异常然后进行处理

void my_terminate_handler()
{
  // Abnormal program termination (terminate() function was called)

  // Do something here

  // Finally, terminate program
  exit(1); 
}

void main()
{
  set_terminate(my_terminate_handler); //< 一定要main程序开始后就注册异常处理函数

  terminate();
}

set_terminate类似的还有set_unexpected_set_purecall_handlerSetUnhandledExceptionFilter用法和上面一样,只是针对的是各自不同的异常

2.3 通过信号量来捕捉程序的异常

void sigabrt_handler(int)
{
	// Caught SIGABRT C++ signal

	// Terminate program
	exit(1);
}

int main()
{
    signal(SIGABRT, sigabrt_handler);
}

SIGABRT是一种异常类型,总共有以下7种:

  1. SIGINT 2. SIGILL 3. SIGFPE 4. SIGSEGV 5. SIGTERM 6. SIGBREAK 7. SIGABRT

3.最后推荐一个dump日志生成库 -- google breakpad

google breakpad 是一款开源的跨平台dump日志生成库,具体使用方法请自行查阅官网说明

  • 注: 以上记录仅限于windows单线程,如果是多线程请查看各自msdn说明,其它平台紧供参考

免责声明:文章转载自《C++随机崩溃捕捉处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇日常小脚本——脚本实现硬盘的自动挂载Windows下进程通信方式[转]下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#系列之聊聊.Net Core的InMemoryCache

个人博客:http://www.boydwang.com/2017/12/net-core-in-memory-cache/ 这两天在看.net core的in memory cache,这里记录一下用法,主要涉及MemoryCache的Get/Set/Expire/Flush。首先我们先用dotnet命令创建一个mvc的项目,这里我们将使用post...

C# DllImport 方法,出现 The system cannot find the file specified 错误

最近使用 C# 调用 dll 中的 UpdateDriverForPlugAndPlayDevices() 方法去安装驱动,遇到了 “The system cannot find the file specified” 问题, 看着错误提示,是指系统没有找到指定文件,但是我检查硬盘,该文件确实存在,但是因为我测试时使用的是 Hebrew 希伯来语的系统,我...

MethodImplOptions.Synchronized的一点讨论

Review代码发现有一个方法加了[MethodImpl(MethodImplOptions.Synchronized)] 属性,这个属性的目的,从名字上就可以看出,是要对所有线程进行同步执行。 对方法加上这个属性之后,会把整个方法体加在一个同步块中,比如下面的代码: [MethodImpl(MethodImplOptions.Synchronized)]...

Spring方法级别数据校验:@Validated + MethodValidationPostProcessor

每篇一句 在《深度工作》中作者提出这么一个公式:高质量产出=时间*专注度。所以高质量的产出不是靠时间熬出来的,而是效率为王 相关阅读 【小家Java】深入了解数据校验:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例【小家Java】深入了解数据校验(Bean...

面试 -- 核心篇 -- 中间件(消息)

面试 -- 核心篇 -- 中间件(消息) 消息队列的应用场景参考网址:消息队列的四种应用场景         消息队列设计思路 (1)异步处理 用户注册时,可以同时将 发送邮件 和 发送短信 功能放到消息队列中实现。可以提高用户响应时间,提高系统吞吐量。 (2)应用解耦 用户下单和库存扣账中使用消息,可以防止库存系统出问题后,导致用户下单失败。 (3...

Windows 汇编语言编程教程[转]

  目录 介绍   ……………………………………………………………………………2 为什么选用汇编语言 …………………………………………………………2 为什么选择Windows系统……………………………………………………2 Ⅰ开始学习之旅 ……………………………………………………………….…3 编译器   ……………………………………………………………………...