linux 环境下 c++ 程序打印 core dump 信息

linux 信号机制

软中断信号 Signal,简称信号,用来通知进程发生了异步事件,进程之间可以互相通过系统调用 kill 等函数来发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。

进程对信号的处理

进程对信号的处理有三种方式:

忽略信号: 大部分信号可被忽略,除SIGSTOP和SIGKILL信号外(这是超级用户杀掉或停掉任意进程的手段)。

捕获信号: 注册信号处理函数,它对产生的特定信号做处理。

信号默认动作: unix内核定义的默认动作,有5种情况:
a) 流产abort:终止进程并产生core文件。
b) 终止stop:终止进程但不生成core文件。
c) 忽略:忽略信号。
d) 挂起suspend:挂起进程。
e) 继续continue:若进程是挂起的,则resume进程,否则忽略此信号。

捕获进程退出信号

当程序由于某种原因要退出时,系统也会给进程发送信号。
此时,如果没有对信号进行捕获,进程就会执行默认退出动作。
当软件在客户环境运行时,为了方便 debug, 可以在程序异常退出时,打印程序当前的堆栈信息

下面五种都是进程退出信号。

// 捕获信号,对于这些信号都执行 coreDumpHandle
signal(SIGQUIT, coreDumpHandle);
signal(SIGILL, coreDumpHandle);
signal(SIGABRT, coreDumpHandle);
signal(SIGSEGV, coreDumpHandle);
signal(SIGTRAP, coreDumpHandle);

可以通过在终端执行 man 7 signal 查看各种信号的说明

c++ 打印堆栈信息

#include <signal.h>
#include <execinfo.h>
#include <dlfcn.h>
#include <cxxabi.h>
#include <QFile>
#include <QTextStream>void coreDumpHandle(int signum) {string path = "/xxx/xxx/coreDump.log";void* callStack[128];int frames = backstrace(callStack, sizeof(callStack) / sizeof(callStack[0]));char** strs = backtrack_symbols(callStack, frames);if (strs == nullptr)exit(0);QFile out(path.c_str());if (!out.open(QIODevice::WrietOnly | QIODevece::Text | QIODevice::Truncate)) {exit(0);}QTextStream textStream(&out);textStream << "Get signal: " << strsignal(signum) << "\n";textStream << "Call stack:\n";unsigned count = 0;for (int i = 0; i < frames; ++i) {Dl_info info;if (dladdr(callStack[i], &info) && info.dli_sname) {int status;char* demangled = abi::__cxa_demangle(info.dli_sname, nullptr, nullptr, &status);if (status == 0) {QString str = QString("[%1] %2 : %3 0x%4\n").arg(count++).arg(info.dli_fname).arg(demangled).arg(reinterpret_cast<quintptr>(((void*)callStack[i])), 0, 16);textStream << str;} else {QString str = QString("[%1] %2 : %3 0x%4\n").arg(count++).arg(info.dli_fname).arg(info.dli_fname).arg(reinterpret_cast<quintptr>(((void*)callStack[i])), 0, 16);textStream << str;}free(demangled);}else {// printf("[%d] %s : ???\n", i, info.dli_fname);}}out.close();free(strs);exit(0);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt开发环境的安装与问题的解决(2)

文章目录 1. Qt开发环境安装的说明2. 通过安装包进行安装3. 通过在线下载程序 解决问题下载 https....网路错误问题解决开始安装--第一部分开始安装--第二部分 4. 建议配置环境变量&#xff08;非必须&#xff09;配置环境变量的意义 简介&#xff1a;这篇文章主要分享Qt开发环…

【每日EDA行业分析】2025年4月25日

深度总结&#xff1a;EDA 软件行业现状与发展趋势 一、引言 在半导体产业的复杂生态中&#xff0c;EDA 软件宛如一颗闪耀的明珠&#xff0c;它是集成电路设计的核心工具&#xff0c;贯穿芯片从设计构思到最终封装测试的全流程&#xff0c;其重要性不言而喻&#xff0c;被誉为…

flutter实践:比例对比线图实现

需求&#xff1a;flutter实现一个左右对比线图,带有动画效果 效果图&#xff1a; Widget _buildTop() {return Container(height: themeData.heightXl,padding: EdgeInsets.symmetric(horizontal: themeData.hSpacingMd),child: Row(mainAxisAlignment: MainAxisAlignment.spa…

测试基础笔记第十五天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、集合1.集合的定义二、使用集合列表去重 导包二、函数1.函数介绍2.定义函数3.调用函数4.函数实现登录案例5.函数的返回值 三、模块和包1.模块的概念(Module)2.模…

Linux中的shell脚本练习

1.判断字符串是否为空 #!/usr/bin/bash while : #:默认值为真 do read -p "请输入你的密码: " a pass123456 if [ -z $a ];thenecho "您输入的密码不能为空"exit 1 elseif [ $a $pass ];thenecho "登录成功"breakelseecho "您的密码输入有…

使用命令关闭Redis服务端

使用命令关闭Redis服务端。 命令 redis-cli -a 111111 -p 6379 shutdown 有些人redis的端口不是6379&#xff0c;那就自己查一下 参数解释&#xff1a; -a&#xff1a;Redis密码 -p&#xff1a;Redis端口 shutdown&#xff1a;关闭命令

嵌入式RTOS实战:uC/OS-III最新版移植指南(附项目源码)

文章目录 前言一、uC/OS简介二、工程移植2.1 下载ucos源码2.2 创建空白工程2.3 拷贝ucosiii源码文件2.3.1 UC-CONFIG2.3.2 UC-CPU2.3.3 UC-LIB2.3.4 UC-OS3 2.3 添加工程文件分组及路径2.4 代码首次编译2.5 源码修改2.5.1 cpu_cfg.h2.5.2 os_cpu_c.c2.5.3 lib_cfg.h2.5.4 sys.h…

TypeScript中的函数类型定义与类型约束

函数类型定义与类型约束 一、核心概念&#xff1a;类型别名与函数类型 1. 类型别名&#xff08;Type Alias&#xff09; 定义 类型别名使用 type 关键字为现有类型创建一个新名称&#xff0c;可以用于&#xff1a; 基础类型&#xff08;如 string、number&#xff09;&…

相机DreamCamera2录像模式适配尺寸

在开发中遇到 一个问题&#xff0c;相机切换视频模式时&#xff0c;预览时&#xff0c;界面不能充满屏幕两侧有黑边&#xff0c;客户要求修改&#xff0c;在此记录 一问题现象&#xff1a; 系统相机在视频模式下预览时如下现象如图1&#xff0c;期望现象如图2: 图1 …

SpringCloud组件——Gateway

一.网关 1.问题提出 我们通过Eureka&#xff0c;Nacos解决了服务注册&#xff0c;服务发现的问题&#xff0c;使用SpringCloud LoadBalance解决了负载均衡的问题&#xff0c;使用OpenFeign解决了远程调用的问题。 但是当前所有微服务的接口都是直接对外暴露的&#xff0c;可…

C#中构造器及属性的加载顺序

一.基本原则: 先加载静态构造函数和静态字段,后加载普通构造函数和普通字段;先加载基类再加载子类; 二.具体的加载顺序: 父类静态字段--->父类静态构造函数--->子类静态字段--->子类静态构造函数--->父类实例字段---> 父类实例构造函数--->子类实例字段-…

Python面试问题

一、Python 基础 1. Python 的特点 动态类型&#xff1a;变量无需声明类型。解释型语言&#xff1a;逐行解释执行。支持多种编程范式&#xff08;面向对象、函数式、过程式&#xff09;。 2. 列表&#xff08;List&#xff09;与元组&#xff08;Tuple&#xff09;的区别 特…

计算机视觉进化论:YOLOv12、YOLOv11与Darknet系YOLOv7的微调实战对比

摘要 YOLO系列作为实时目标检测领域的重要里程碑&#xff0c;持续引领速度与精度的平衡发展。本文围绕YOLOv7&#xff08;基于Darknet框架&#xff09;、YOLOv11及YOLOv12&#xff0c;系统、深入地对比了三款模型的架构创新、微调策略、核心技术及应用场景。我们详细解析了三者…

SQL Server 存储过程开发规范

SQL Server 存储过程开发规范&#xff08;高级版&#xff09; 1. 总则 1.1 目标 本规范旨在&#xff1a; 提高存储过程的事务一致性、异常可追踪性、错误透明度。 统一日志记录、错误码管理、链路追踪&#xff08;Trace ID&#xff09;。 支持复杂事务场景&#xff08;嵌套…

opendds的配置

配置的使用 文档中说明有4种使用配置的方式&#xff1a; 环境变量 命令行参数&#xff08;将覆盖环境变量中的配置&#xff09; 配置文件&#xff08;不会覆盖环境变量或命令行参数中的配置&#xff09; 用户调用的 API&#xff08;将覆盖现有配置&#xff09; 这里对开发…

(Go Gin)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收

1. 路由 gin 框架中采用的路优酷是基于httprouter做的 HttpRouter 是一个高性能的 HTTP 请求路由器&#xff0c;适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用&#xff0c;特别适合需要高性能和简单路由的应用场景。 主要特点 显式匹配&#xff1a;与其他路由…

Marin说PCB之----板材的替换注意事项

由于最近很多武林上的主流门派都需要采用将的本方案&#xff0c;小编所在的宗门古族也是不例外了&#xff0c;宗门大长老韩立现在想把之前一直在用的板材EM370Z替换成生益的Autolad3&#xff0c;让我去拿资料分析一下是否可以替换。下图所示是就是小编我做的一个表格关于两家板…

4月28日信息差全景:国际局势、科技突破与市场震荡一、国际政治与安全:俄乌冲突关键转折

一、国际政治与安全:俄乌冲突关键转折 1. 乌克兰反攻进展与情报差异 前线动态: 俄国防部称在顿涅茨克击退乌军三次进攻,摧毁12辆坦克;乌方则宣布在巴赫穆特南部推进2公里,双方战报存在显著差异。 信息差根源:战场信息管控导致西方媒体与俄媒报道截然不同。 国际援助: 美…

关系数据的可视化

目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 一、安装Python所需要的第三方模块 二、实验 【实验总结】 【实验目的】 1.掌握关系数据在大数据中的应用 2.掌握关系数据可视化方法 3. python 程序实现图表 【实验原理】 在传统的观念里面&#xff0…

夏季道路安全的AI革命:节省人力、提升效率

AI夏季道路安全&#xff1a;用智能算法守护每一条街道 背景&#xff1a;夏季道路安全的挑战与机遇 夏季是道路安全事件的高发期。高温天气容易导致驾驶员疲劳、行人行为异常&#xff08;如跌倒或中暑&#xff09;&#xff0c;同时&#xff0c;车流量增加、夜间活动频繁…