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) 的相关文章

  • 从 unsigned char* 到 char* 的转换无效

    这是一个代码 1 int main int argc char argv 2 3 signed char S psc 4 unsigned char U pusc 5 char C pc 6 7 C S 8 C U 9 10 pc psc
  • ptrace和waitpid有什么关系?

    我正在练习使用ptrace但我不太了解它和之间的关系waitpid 这是我的测试程序 int main int argc char argv pid t pid 22092 if ptrace PTRACE ATTACH pid NULL
  • 如何准备sql语句并绑定参数?

    不幸的是 文档 http www sqlite org完全缺乏示例 这真的很奇怪 就好像它假设所有读者都是优秀的程序员一样 然而 我对C 并且无法真正从文档中弄清楚如何真正准备和执行语句 我喜欢它的实施方式PDO for PHP 通常 我只
  • 为基于架构的 XML 文件创建 WPF 编辑器

    这是场景 我们的服务器产品之一使用大型 XML 配置文件 该文件的布局相当好 并且针对 XSD 文件进行了验证 现在是时候构建一个配置 GUI 来维护这个文件了 我想深入研究 WPF 来完成它 我可以为每个配置部分布置一个单独的表单 每次向
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • 如何使用 libclang 判断成员函数是 const 还是 volatile?

    我有一个实例CXCursor同类CXCursor CXXMethod 我想知道这个函数是否是const or volatile 例如 class Foo public void bar const void baz volatile voi
  • 仅针对某些异常类型中断

    我知道异常处理是一件非常重要的事情 我们在所有项目中都在这样做 主要原因是记录客户发生的错误 这工作正常 根本不是问题 但是 当我仍在使用 Visual Studio 编码和运行应用程序时 我根本不需要任何异常处理 我希望调试器正好停在应用
  • 公共基类打破了元组的空基类优化

    gcc 4 7 1 对元组进行空基类优化 我认为这是一个非常有用的功能 然而 这似乎有一个意想不到的限制 include
  • 如何在 C# 中创建 PKCS12 .p12 文件?

    这可能是一个n00b问题 但我在这方面确实没有任何经验 我需要创建一个包含 X509 证书和私钥的 p12 捆绑包 我当前有两个对象 X509Certificate2 和包含关键信息的 RSAParameters 对象 如何将它们合并到 p
  • 如何在控制器中使用多个 DBContext

    如何在控制器中使用多个 DBContext 我尝试以不同的方式重载构造函数 一些控制器 public C1 DBContext1 a DBContext2 b DBContext3 c public C1 DBContext1 a publ
  • 无法在 Visual Studio 和 vcpkg 中构建 cmake 项目(致命错误 C1083)

    我今天安装了vcpkg 启用了与Visual Studio的集成 即 vcpkg集成安装 并开始安装库 我基本上安装了 cpprestsdk 并触发了 boost 库的安装 然后我在 Visual Studio CMake 中打开该项目 当
  • Moq - 是否可以在不使用 It.IsAny 的情况下设置模拟

    我一直使用 Moq 进行单元测试 有时我会嘲笑有很多参数的方法 想象一下这样的方法 public class WorkClient public void DoSomething string itemName int itemCount
  • Bazel:将编译标志添加到默认 C++ 工具链

    我想向默认的 C 工具链添加一些编译器和链接器标志 以便我构建的所有目标 本地或导入 共享它们 我知道可以定义我自己的工具链 但我不想这样做 因为它非常复杂且容易出错 理想情况下我想要这样的东西 cc toolchain cc defaul
  • VS C# 中的依赖地狱,找不到依赖项

    我创建了一个图表 C 库 我们称之为chartlibrary 它本身依赖于多个第三方 dll 文件 在另一个可执行项目中 我们称之为chartuser 我参考了chartlibrary项目 两个项目位于 Visual Studio 中的同一
  • 为什么 std::atomic 比 volatile bool 慢很多?

    多年来我一直使用 volatile bool 来控制线程执行 并且效果很好 in my class declaration volatile bool stop In the thread function while stop do th
  • C++ 更改屏幕方向问题 -- DEVMODE dmDisplayOrientation DMDO_90 undefined

    我似乎无法编译一些 C 代码 我正在翻转显示器的方向 但 VS2008 告诉我 DMDO 90 和 DMDO 270 无法识别 error C2065 DMDO 90 undeclared identifier error C2065 DM
  • C# 中的类和模块有什么用

    有人可以解释一下类和模块之间的区别吗 你什么时候使用其中一种而不是另一种 我正在使用 C 更新 我的意思是相当于 VB 模块的 C 版本 这在很大程度上取决于您所指的 模块 Visual Basic 的模块 C 中没有真正等效的 VB Ne
  • 在 boost 元组、zip_iterator 等上使用 std::get 和 std::tie

    我有哪些使用选择std get lt gt and std tie lt gt 与增强结构一起 例子 我想使用基于范围的 for 循环在多个容器上进行迭代 我可以实施zip函数 它使用boost zip iterator include
  • 什么是 C++11 扩展 [-Wc++11-extensions]

    我需要一些帮助来了解此错误发生的位置 警告 非静态数据成员的类内初始化是 C 11 扩展 Wc 11 extensions 这是它来自的代码部分 typedef struct Hand bool straight false bool fl
  • Cordova 上的 ClearCookiesAsync()

    我正在尝试使用 wp8 cordova 中的插件来清除 WebBrowser cookie 我已经让它与 JavaScript 进行通信 并且我的 c 文件中有类似这样的内容 using WPCordovaClassLib Cordova

随机推荐

  • 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