当前位置: 首页 > news >正文

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.xdnf.cn/news/202159.html

相关文章:

  • 滑动窗口模板
  • 【基础知识】常见的计算公式(一)
  • java借助NIO、链表、跳表模拟实现redis
  • CDGP|如何建立高效的数据治理团队?
  • 【强化学习系列】贝尔曼方程
  • mysql模糊多次OR查询某一个字段,针对这个字段进行查询分组
  • Marin说PCB之----板材的替换注意事项
  • vite创建vue3项目并进行配置
  • DIFY教程第三弹:构建一个智能生成图片的Agent
  • 【分布式系统中的“瑞士军刀”_ Zookeeper】三、Zookeeper 在实际项目中的应用场景与案例分析
  • openGauss DB4AI与scikit-learn模块对比探究
  • 基于强化学习的用于非刚性图像配准的引导式超声采集|文献速递-深度学习医疗AI最新文献
  • HTML标记语言_@拉钩教育【笔记】
  • 座舱系统香氛模块概念
  • 【Linux】第十一章 管理网络
  • COMEM光纤温度传感器Optocon:可靠稳定的温度监测方案
  • 2025三掌柜赠书活动第十五期:高并发系统:设计原理与实践
  • 跨语言哈希一致性:C# 与 Java 的 MD5 之战?
  • PHP经验笔记
  • 大模型相关问题解答
  • 记一次奇妙的Oracle注入绕WAF之旅
  • vue-router: vue3路由管理器
  • 新时代下的存储过程开发实践与优化
  • AI大模型入门指南——概念篇
  • 语音合成之九注意力机制在TTS中的应用:让模型“听懂”文本
  • 从零开始学AI教程 初学者入门指南
  • 推荐私有化部署的企业内部通讯软件BeeWorks
  • 如何解决 Linux 文件系统挂载失败的问题
  • 在C# WebApi 中使用 Nacos01:基础安装教程和启动运行
  • 金融业数字化转型——深入解读77页2024年中国金融体系指标大全【附全文阅读】