C++ 捕捉 crash 信号(win&Linux)

2023-11-16


作为一个程序员,必现的 bug 容易排查,最怕遇见非必现 bug,尤其是那种在自己环境上测多少次都没问题,到用户环境偶尔会 crash,无从下手,让人瞬间抓狂。并且像这种非必现 bug 一般很难采用日志的方式来定位。

又或者是那种当程序 crash 的时候,想要做一些操作

今天做项目遇到了这种问题,特此记录一下

Win

windows 实际上已经提供了可以捕捉异常信号的方法 SetUnhandledExceptionFilter() ,当程序 crash 的时候,会调用这个函数,进而执行你想要执行的操作

函数说明

头文件

  • #include <windows.h>

返回值 (可以理解为 int 类型,一般用不上)

  • EXCEPTION_EXECUTE_HANDLER 1 表示我已经处理了异常,可以优雅地结束了
  • EXCEPTION_CONTINUE_SEARCH 0 表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束
  • EXCEPTION_CONTINUE_EXECUTION -1 表示错误已经被修复,请从异常发生处继续执行

SetUnhandledExceptionFilter 官方说明

具体例子

void exceptionHandler(PEXCEPTION_POINTERS excpInfo) {
   // 执行自己想要执行的操作。也就是说,当程序 crash 的时候,会执行这块代码
}

LONG WINAPI unhandledException(PEXCEPTION_POINTERS excpInfo = nullptr) {
  if (excpInfo == nullptr) {
    __try  
    {
      RaiseException(EXCEPTION_BREAKPOINT, 0, 0, nullptr);
    } __except(exceptionHandler(GetExceptionInformation()),
                EXCEPTION_EXECUTE_HANDLER) {
    }
  } else {
    exceptionHandler(excpInfo);
  }

  return 0;
}

int main(int argc, char** argv) {
  SetUnhandledExceptionFilter(unhandledException);
}

Linux

linux 捕捉信号比 windows 要简单一点,因为 linux 下已经有了一些信号:

SIGINT     2 // interrupt
SIGILL      4 // illegal instruction - invalid function image
SIGFPE     8 // floating point exception
SIGSEGV   11 // segment violation
SIGTERM   15 // Software termination signal from kill
SIGBREAK  21 // Ctrl-Break sequence
SIGABRT    22 // abnormal termination triggered by abort call
SIGABRT_COMPAT 6 // SIGABRT compatible with other platforms, same as SIGABRT

具体例子

void SignalHandler(int sig) { 
    // 执行自己要执行的操作
}

void InitSignalHandler(void) {
  signal(SIGINT, SignalHandler);  // Ctrl + c
  signal(SIGILL, SignalHandler);
  signal(SIGSEGV, SignalHandler);
  signal(SIGABRT, SignalHandler);
  signal(SIGTERM, SignalHandler);  // kill -15
  signal(SIGTSTP, SignalHandler);  // Ctrl + z (cannot be caught or ignored)
  signal(SIGKILL, SignalHandler);  // kill -9 (cannot be caught or ignored)
  signal(SIGQUIT, SignalHandler);
}

int main() {
  InitSignalHandler();
}

如果要知道如何 crash 后的情况下保存 dump 文件。看另一篇文章

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 捕捉 crash 信号(win&Linux) 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • idea 配置log4j

    1 导入log4j jar包 放在lib目录下 右键jar包 createlibrary 好像是 还有一种方法 2 配置log4j properties文件 设置输出信息 DEBUG级别和ERROR级别 log4j rootLogger d
  • 【图像检测】基于计算机视觉和滤波实现热红外图像温度检测系统含Matlab源码

    1 简介 读入给定的热红外图像 完成彩色图像灰度化 对步骤1中的灰色图像加噪 并采用不同的方法对不同的加噪图像去噪 使得去噪效果更佳 基于灰度图像中标准温度对照带 提取图像中各像素的温度值 2 部分代码 function varargout
  • Keras-多输入多输出【多任务】

    模型结果设计 代码 from keras import Input Model from keras layers import Dense Concatenate import numpy as np from keras utils i
  • Reid 论文文章

    Reid 论文探索 Harmonious Attention Network for Person Re Identification 着重在空间注意力和通道注意力上 结构设计比较巧妙 通过global和local的两级将特征细化 参考链接
  • [QT_027]Qt学习之按钮类控件(QPushButton、QToolButton、QRadioButton、QCheckBox、QCommandLinkButton)

    本文转自 Qt编程指南 作者 奇先生 Qt编程指南 Qt新手教程 Qt Programming Guide 5 1 按钮类的控件 本节介绍图形程序里常见的按钮 包括普通的按钮按钮 之前都用过多次了 还有单选按钮 复选框 命令链接按钮等 本节
  • 【python】jupyter notebook的快捷键

    Jupyter Notebook 提供了许多快捷键以方便操作 这些快捷键分为两类 命令模式快捷键和编辑模式快捷键 命令模式快捷键 在命令模式下 细胞边框是蓝色的 这些快捷键主要用于操作单元格 Enter 进入编辑模式 Shift Enter
  • NoSQL数据库如何选型

    NoSQL数据库在体系结构和功能上各不相同 整体来说 NoSQL数据库选型需要从数据模型和存储特性两方面综合考虑 一 数据模型 NoSQL数据模型包括键值 宽列 图形 文档等 与关系型数据库使用的数据结构不同 具有高扩展性 弱一致性 适合分
  • Ozone作为Hadoop FileSystem的配置使用

    文章目录 前言 Ozone FileSystem的Hadoop兼容性文件系统实现原理 Ozone FileSystem的配置 Ozone FileSystem的使用 引用 前言 Ozone作为同样隶属于Hadoop大数据生态圈的一个系统 尽
  • Dynamics CRM 365 电子邮箱配置

    Dynamics CRM 365 如何配置电子邮箱服务 电子邮件服务器配置 电子邮件配置设置 邮箱 注意 天天在踩坑 坑坑不一样 启用CRM的电子邮箱通知 1 先配置电子邮件服务器文件 2 在电子邮件配置中设置好相关属性配置 3 在邮箱中设
  • NPOI从数据库中调取数据直接导出到EXCEL中

    https blog csdn net weixin 30725315 article details 98769248 一 关于NPOI NPOI是POI项目的 NET版本 是由 Tony Qu http tonyqus cnblogs
  • 证明正定矩阵的充要条件:全部顺序主子式大于0

    定理 f x T A x f x TAx f xTAx 正定的充要条件是
  • ChatGLM-6B,支持在单张消费级显卡上进行推理使用 案例

    近日 由清华技术成果转化的公司智谱AI 开源了 GLM 系列模型的新成员 中英双语对话模型 ChatGLM 6B 支持在单张消费级显卡上进行推理使用 这是继此前开源 GLM 130B 千亿基座模型之后 智谱AI 再次推出大模型方向的研究成果
  • artTemplate 模板引擎(简洁语法/原生语法)

    1 artTemplate 简洁语法模板 1 引入插件 lt script src template js gt 2 编写模板
  • flea-common使用之通用策略模式实现

    通用策略模式实现 Flea Strategy 1 概述 2 参考 3 实现 3 1 定义Flea策略接口类 3 2 定义狗喊叫声策略类 3 3 定义猫喊叫声策略类 3 4 定义鸭喊叫声策略类 3 5 定义策略上下文接口类 3 6 定义Fle
  • 采坑系列:Waves MaxxAudio Pro无法正常启动,插入耳机窗口闪过,耳机没声音

    解决 用驱动精灵下载这个版本的驱动就可以解决 参考网址 http tieba baidu com p 5887035088 第11楼 降低声卡驱动版本
  • 图像拼接技术步骤归纳

    前言 图像拼接也是计算机视觉领域的一个研究热点 本人这段时间内也对该算法进行了一番研究 在这里把其思想步骤简单归纳总结一下 以免忘记 一 算法目的 随便拍摄两张图片 图1和图2 两图之间有相同的拍摄区域 需要将两幅图无缝拼接在一起 完全接壤
  • AcWing 1227. 分巧克力(二分)

    输入样例 2 10 6 5 5 6 输出样例 2 include
  • 归并排序(递归,非递归)

    目录 写在前面的话 一 归并思想 二 归并排序递归实现 2 1思想实现 2 2排序实现 2 3代码实现 三 归并排序非递归实现 3 1思路实现 小区间优化 3 2边界值处理 3 2代码实现 写在前面的话 小伙伴们大家好啊 今天依旧小菜鸡库森
  • 高并发,你真的理解透彻了吗

    高并发 几乎是每个程序员都想拥有的经验 原因很简单 随着流量变大 会遇到各种各样的技术问题 比如接口响应超时 CPU load升高 GC频繁 死锁 大数据量存储等等 这些问题能推动我们在技术深度上不断精进 在过往的面试中 如果候选人做过高并
  • C++ 捕捉 crash 信号(win&Linux)

    目录 Win 函数说明 具体例子 Linux 具体例子 作为一个程序员 必现的 bug 容易排查 最怕遇见非必现 bug 尤其是那种在自己环境上测多少次都没问题 到用户环境偶尔会 crash 无从下手 让人瞬间抓狂 并且像这种非必现 bug