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.pswp.cn/bicheng/78835.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78835.shtml
英文地址,請注明出處:http://en.pswp.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;車流量增加、夜間活動頻繁…