Linux开启coredump

在Linux系统中,C/C++程序崩溃是常见的问题之一。Coredump是指当一个程序崩溃时,系统把程序运行时的内存数据以二进制文件的形式保存下来,以便程序开发者进行崩溃分析。本文将介绍如何开启并配置Coredump

1、查看并配置coredump

在Linux系统中,默认情况下是不会生成Coredump文件的。需要手动开启并配置

1.1 状态查看

使用ulimit命令检查系统Coredump配置(默认情况下,Coredump是被关闭的)

ulimit -a

若输出结果中的"core file size"为"0",则表示Coredump被关闭。

修改系统Coredump配置

ulimit -c unlimited

这条命令会将Coredump文件大小设置为无限制。修改完成后,使用ulimit命令再次检查Coredump配置,确认修改成功。如果希望设置一个特定的大小限制,可以将unlimited替换为所需的大小,单位为blocks(块),通常是512字节。例如,ulimit -c 1024将限制core dump文件的大小为1024 blocks,即512KB。
在这里插入图片描述

1.2 配置

开启coredump的shell脚本, dump路径为当前目录下的crashdump目录中

#!/bin/bashDUMP_PATH=`pwd`/crashdump# 检查当前用户是否具有sudo权限
if [ "$(id -u)" != "0" ]; thenecho "请使用sudo运行此脚本"exit 1
fi# 配置Coredump
echo 2 > /proc/sys/fs/suid_dumpable
echo "$DUMP_PATH/%e.%p.%t.coredump" > /proc/sys/kernel/core_pattern# 创建Coredump保存目录
mkdir -p $DUMP_PATH
chmod 777 $DUMP_PATH# Coredump功能已开启 配置信息
cat /proc/sys/fs/suid_dumpable
cat /proc/sys/kernel/core_pattern
  • /proc/sys/fs/suid_dumpable: 这个节点用于控制setuid程序的Coredump生成行为。它有以下取值:
  • 0:禁止setuid程序生成Coredump文件;
  • 1:只允许root用户获取setuid程序的Coredump文件;
  • 2:允许任何用户获取setuid程序的Coredump文件。

可在root权限下手动执行上面的命令, 或使用sudo权限如:

sudo bash -c 'echo 2 > /proc/sys/fs/suid_dumpable'
  • /proc/sys/kernel/core_pattern:这节点用于指定Coredump文件的保存路径和文件名格式。它的取值可以是一个文件路径,也可以是一个字符串模板。当Coredump文件生成时,系统会根据这个配置项指定的路径和模板生成Coredump文件。

在模板中,可以使用以下占位符:

  • %e:可执行文件名
  • %p:进程ID
  • %u:当前用户ID
  • %g:当前用户组ID
  • %s:生成Coredump文件时的信号
  • %t:生成Coredump文件时的时间戳
  • %h:主机名

注意: 可以用cat查看节点状态如: cat /proc/sys/fs/suid_dumpable

1.3 Coredump配置永久生效

修改/etc/sysctl.conf文件

fs.suid_dumpable = 1
kernel.core_pattern = /tmp/core-%e.%p.%t
  • fs.suid_dumpable:同上
  • kernel.core_pattern: 同上

修改完成后,更新配置(生效)

sysctl -p
  • 注: /etc/sysctl.conf是一个在Linux系统中用于配置内核参数的配置文件。它包含了一系列键值对,用于设置内核参数的值,以优化系统性能和安全性。
    在Linux系统中,如果一个setuid程序崩溃并生成了Coredump文件,那么这个Coredump文件将包含setuid权限执行时的内存数据,这个数据可能包含敏感信息。因此默认情况下,Linux系统不会为setuid程序生成Coredump文件。将fs.suid_dumpable设置为2,则表示可以为setuid程序生成Coredump文件并保存内存数据,这可能会带来安全风险,需要在使用时仔细评估风险和利益。

修改/etc/security/limits.conf 文件

允许系统中的所有用户生成无限制大小的coredump文件, 对于某些操作系统或发行版,可能具有不同的文件名或位置以及格式

* soft core unlimited
* hard core unlimited

2、示例crash程序

为了演示Coredump文件的分析过程,我们创建一个简单的C++程序。代码如下:

void test(int *ptr) {*ptr = 6;}int main() {int *ptr = nullptr;// 是不小心, 还是故意的?test(ptr);return 0;
}

这个程序会在运行时出现段错误,导致程序崩溃。

3、获取coredump并使用GDB分析

运行上述程序,可以看到程序崩溃并输出了一条错误信息

Segmentation fault (core dumped)

这条信息表明程序出现了段错误,并生成了Coredump文件(路径为文章开始配置的路径)。Coredump文件的路径和文件名可以在上面的kernel.core_pattern中指定, 或查看文件节点/proc/sys/kernel/core_pattern。

现在,我们需要使用GDB来分析Coredump文件。执行以下命令:

gdb <program_name> <core_dump_file>

执行以上命令后,GDB会打开并加载Coredump文件。可以使用bt命令查看崩溃时的函数调用栈,使用info命令查看变量值,以及使用其他GDB命令进行更深入的分析

4、分析的基本技巧

在进行Coredump分析时,以下是一些基本的技巧:

  • 查看函数调用栈: 使用bt命令可以查看崩溃时的函数调用栈,找到出错的函数。
  • 查看变量值: 使用info命令可以查看 寄存器值等,找到出错的变量。
  • 使用GDB命令进行更深入的分析: GDB提供了很多命令,比如p(打印变量值)、x(查看内存)、watch(设置变量监视器)等,可以帮助开发者进行更深入的分析。熟练掌握这些命令可以提高分析效率。
  • 使用符号表: 如果程序是使用编译器编译的,那么可以使用符号表来查看函数名、变量名等信息。使用以下命令生成符号表:
g++ -g <program_name>.cpp -o <program_name>

其中,-g选项表示生成符号表。生成符号表后,可以在GDB中查看函数名、变量名等信息。
在这里插入图片描述

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

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

相关文章

基于微信小程序+SpringBoot+Vue的垃圾分类系统(带1w+文档)

基于微信小程序SpringBootVue的垃圾分类系统(带1w文档) 基于微信小程序SpringBootVue的垃圾分类系统(带1w文档) 本垃圾分类小程序也是紧跟科学技术的发展&#xff0c;运用当今一流的软件技术实现软件系统的开发&#xff0c;让环保方面的信息完全通过管理系统实现科学化&#xf…

不是演练 “毒云藤”再出击,知网用户成钓鱼攻击目标

亚信安全威胁情报中心近期在梳理安全事件时&#xff0c;发现一起钓鱼攻击活动。该起事件仿冒网易云邮箱进行钓鱼攻击&#xff0c;成功窃取到用户信息后将用户信息post到本地的”login.php”目录下保存&#xff0c;并跳转到正常网站。经分析&#xff0c;判断该行为符合绿斑APT组…

FastAPI(八十二)实战开发《在线课程学习系统》接口开发-- 课程上架下架

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 课程上架/下架 1、是否登录 2、角色权限 3、课程是否存在 4、是否是自己的课程 4、课程如果是上架状态&#xff0c;则下架&#xff0c;反之&#xff…

【Python第三方库】PyQt5安装与应用

文章目录 引言安装PYQT5基于Pyqt5的简单桌面应用常用的方法与属性QtDesigner工具使用与集成窗口类型QWidget和QMainWindow区别 UI文件加载方式直接加载UI文件的方式显示窗口转化py文件进行显示窗口 PyQt5中常用的操作信号与槽的设置绑定页面跳转 引言 PyQt5是一个流行的Python…

AutoSar中的Spi_SetupEB函数原理与实现

文章目录 一、函数介绍二、项目背景三、函数在AUTOSAR官网中的介绍四、代码实现五、验证六、联调过程中遇到的问题 一、函数介绍 此函数是Autosar标准中的接口&#xff0c;为EB SPI处理器/驱动程序设置缓冲区和数据长度的服务 指定频道。用容易理解的话说就是 设置一下某个通道…

SpringBoot中使用监听器

1.定义一个事件 /*** 定义事件* author hrui* date 2024/7/25 12:46*/ public class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message message;}public String getMessage() …

uniapp手写滚动选择器

文章目录 效果展示HTML/Template部分&#xff1a;JavaScript部分&#xff1a;CSS部分&#xff1a;完整代码 没有符合项目要求的选择器 就手写了一个 效果展示 实现一个时间选择器的功能&#xff0c;可以选择小时和分钟&#xff1a; HTML/Template部分&#xff1a; <picker…

『 Linux 』信号概念与信号的产生 ( 万字 )

文章目录 信号概念前台进程与后台进程信号的本质硬件理解信号的产生Core dump 标志 信号概念 "信号"一词指用来传达信息或只是的各种形式的提示或标志; 在生活中常见的信号例如红绿灯,交通标志,短信通知等 在操作系统中,"信号"是一种用于异步通知进程发生特…

国衍科技——RFID技术的应用

在文物馆藏信息的记录与管理过程中&#xff0c;准确性和详细性是至关重要的。无论是大型博物馆还是私人收藏馆&#xff0c;都需要有效的方法来确保馆藏文物信息的可追溯性和可访问性&#xff0c;才能提供更好的服务和保护馆藏资源。而结合射频识别&#xff08;RFID&#xff09;…

2024年虚拟主机转移教程

转移网站并不困难&#xff0c;但选择正确的选项和最佳程序才是关键。网站托管服务被视为当今数字世界的基石&#xff0c;全球有18 亿个网站。网站所有者可以通过下载备份、将其上传到新服务器并指向域名来手动转移网站。他们还可以通过新网站托管商的助手请求来移动网站。对于初…

华清数据结构day5 24-7-22

1>使用栈&#xff0c;完成进制转换输入&#xff1a;一个整数&#xff0c;进制数输出&#xff1a;该数的对应的进制数 seqstack.h #ifndef SEQSTACK_H #define SEQSTACK_H #define MAX 10 #include"myhead.h" typedef int datatype;typedef struct {datatype *d…

【Tomcat】快速入门

概述 Tomcat是Apache软件基金会一个核心项目&#xff0c;是一个开源免费的轻量级Web服务器&#xff0c;支持Servlet/JSP.少量avaEE规范。Tomcat Tomcat也被称为Web容器、Servlet容器。Servleti程序需要依赖于Tomcat才能运行。 安装使用 下载安装都是绿色版本&#xff0c;解…

Git、Gitlab以及分支管理

分布式版本控制系统 一、Git概述 Git是一种分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更。它由Linus torvalds创建的&#xff0c;最初被设计用于Linux内核的开发。Git 允许开发人员跟踪和管理代码的版本&#xff0c;并且可以在不同的开发人员之间进行协作。 Githu…

全年销售7亿块,巧克力企业如何通过相邻业务打造极致产品力?

蒂罗尔巧克力是日本经典的巧克力品牌。 糖果业务是松尾早期的主营业务&#xff0c;在主营业务下滑的情况下&#xff0c;确立新的竞争方向&#xff0c;通过主营业务优势进入相邻业务&#xff0c;打造新产品成就巧克力极致产品力&#xff0c;避免衰退重回增长。 如何通过进入相邻…

MFC列表框示例

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 目录 1.示例内容 2.程序步骤 3.运行结果 4.代码全文 1.示例内容 编写一个对话框应用程序CMFC_Li6_4_学生信息Dlg&#xff0c;对话框中有一个列表框&#xff0c;当用户…

matlab gui下的tcp client客户端编程框架

GUI界面 函数外定义全局变量 %全局变量 global TcpClient; %matlab作为tcpip客户端 建立连接 在“连接”按钮的回调函数下添加以下代码&#xff1a; global TcpClient;%全局变量 TcpClient tcpip(‘192.168.1.10’, 7, ‘NetworkRole’,‘client’); %连接到服务器地址和端…

【Hot100】LeetCode—152. 乘积最大子数组

目录 题目1- 思路2- 实现⭐152. 乘积最大子数组——题解思路 3- ACM 实现 题目 原题连接&#xff1a;152. 乘积最大子数组 1- 思路 动规五部曲 2- 实现 ⭐152. 乘积最大子数组——题解思路 class Solution {public int maxProduct(int[] nums) {// 初始化答案以及以第一个元…

windows wsl ubuntu系统安装桌面可视化

参考&#xff1a; https://www.bilibili.com/read/cv33557374/ 1&#xff09;首先先安装好wsl ubuntu系统 2&#xff09;安装 Ubuntu 桌面版 sudo apt purge -y acpid acpi-support modemmanagersudo apt-mark hold acpid acpi-support modemmanager sudo apt install ubunt…

黑马头条Day09-用户行为

一、课前准备 1. long类型精度丢失问题 解决方案&#xff1a; 当后端响应给前端的数据中包含了id或者特殊标识&#xff08;可自定义&#xff09;的时候&#xff0c;把当前数据进行转换为String类型当前端传递给后端的dto中有id或者特殊标识&#xff08;可自定义&#xff09;的…

Windows环境下安装docker、配置Ubuntu容器并使用vscode ssh连接到容器

目录 一、Windows环境下安装docker二、配置Ubuntu三、在容器中安装ssh服务参考文章 一、Windows环境下安装docker 在任务栏中搜索**“Windows功能”** -将适用于Linux的Windows子系统和虚拟机平台选上 然后按照提示重启电脑。然后开始安装WSL。通过cmd以管理员身份打开命令提…