Linux开启coredump

news2024/9/23 21:28:23

在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/bash

DUMP_PATH=`pwd`/crashdump

# 检查当前用户是否具有sudo权限
if [ "$(id -u)" != "0" ]; then
  echo "请使用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.coloradmin.cn/o/1950378.html

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

相关文章

mac M1安装Roop教程及所遇到的问题

1.安装miniconda&#xff0c;下载地址&#xff1a; 按 Python 版本划分的最新 Miniconda 安装程序链接&#xff1a;https://docs.anaconda.com/miniconda/miniconda-other-installer-links/ 下载后直接默认安装即可。 我用的是&#xff1a;Python3.10对应的Miniconda 2.下载…

在 ArchLinux 上编译运行 axmol 引擎

本文将在 Windows 10 上安装 Arch WSL 中编译 axmol 请确保 WSL2 已正确安装 1. 在微软应用商店安装 ArchLinux 2. 打开 Arch&#xff0c;按照提示输入用户名和密码&#xff0c;尽量简单 3. 配置清华源&#xff0c;速度快的起飞&#xff0c;否则&#xff0c;各种包会安装失败…

C++必修:模拟实现STL之string

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 为了让我们更加深入理解string&#xff0c;接下来我们将模拟实现一个简易版的stri…

力扣高频SQL 50题(基础版)第十七题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第十七题1075. 项目员工 I题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第十七题 1075. 项目员工 I 题目说明 项目表 Project&#xff1a; ----------------…

四、GD32 MCU 常见外设介绍 (2) GPIO 模块介绍

2.GPIO 模块介绍 GPIO的全称为通用输入输出口&#xff0c;是很多外设能够正常工作的必要条件。除了一些特定功能的引脚(如电源脚)外&#xff0c;MCU上其他的引脚都可以当做GPIO来使用。本章&#xff0c;我们将对GPIO进行简单介绍&#xff0c;并通过一个“流水灯”的实验来熟悉…

力扣刷题-图论-岛屿类问题-集合实现(c++实现)

我的老师&#xff1a;力扣链接这道题题解中最高赞的回答nettee&#xff0c;从这篇题解中我学到了dfs框架以及解决思路&#xff0c;并独立完成了该题解里的几道习题本人刷题的习惯是学会一个板子&#xff0c;然后之后的同类题都机械的用这个板子去做&#xff0c;最好不做创新&am…

广州某展厅门牌创新案例:1*2 OLED柔性屏的精致应用

在广州这座繁华都市的心脏地带&#xff0c;一座现代感十足的展厅悄然矗立&#xff0c;其独特的门牌设计成为了过往行人目光的焦点。这座展厅的门牌采用了前沿的1*2 OLED柔性屏技术&#xff0c;不仅展现了科技与艺术的完美融合&#xff0c;更彰显了展厅的高端定位与创新精神。 项…

容器 string 的模拟实现

容器 string 的模拟实现 开篇解释代码实现&#xff1a;myString.h 头文件myString.cpp 实现文件 模拟实现 string 能对 STL 有更深刻的认识&#xff0c;底层了解越丰富&#xff0c;使用起来越顺手 接下来我会以 .h 头文件以及其 .cpp 的实现文件展示其大致模拟&#xff0c;这只…

【代码】Python3|Scrapy框架初探(汽车之家大连市二手车车辆数据爬取、清洗与可视化)

本篇主要是整个项目的介绍&#xff0c;没提到太多琐碎的技术细节&#xff0c;以后有空的话会整理一下 Scrapy 和原生爬虫的差异&#xff0c;还有它坑人的一些地方&#xff0c;单发出来。 开源地址&#xff1a;https://github.com/shandianchengzi/car_home_spider 使用说明&a…

学习日记:数据类型2

目录 1.转义字符 2.隐式类型转换 2.1 强制类型转换 2.2 不同类型间赋值 3.运算符 表达式 3.1 算术运算符 3.2 算术运算优先级 3.3 赋值运算 3.3.1 不同类型间混合赋值 3.4 逗号运算 4.生成随机数 5. 每日一练 1.转义字符 \n 表示换行 \t …

Vue3可媲美Element Plus Tree组件实战之移除节点

Element Plus Tree自定义节点内容示例中介绍了移除节点的用法&#xff0c;个人觉得作为提供给用户API&#xff0c;应该遵循迪米特法则&#xff0c;把功能实现的细节封装在组件内部&#xff0c;而提供给用户最简单的操作方式&#xff0c;同时在此基础上支持用户的扩展。 因此&a…

ITK-中值滤波

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 中值滤波原理 中值滤波是一种常用的非线性滤波技术&#xff0c;用于去除图像中的噪声&#xff0c;特别是椒盐噪声和脉冲噪声。它…

MM 7 -采购- 询报价

思维导图 说明 sap提供了 询价 报价和比价的功能。 不建议在sap管理。一般引导不在sap管理。 流程&#xff1a; 操作 询价 ME41 报价ME47 比价ME49 拒绝 对于不符合条件的报价进行拒绝 生成信息记录 后台表 Ekko ekpo 。采购凭证类别&#xff1a;A

csa笔记6-网络管理命令

nmcli命令 字符终端&#xff0c;可以立即生效且重启系统后配置也不会丢失 nmtui命令 可视终端&#xff0c;立即生效&#xff0c;重启有效 network.service 管理网络 RHEL 7 以前&#xff1a;使用network.service管理网络 RHEL 7&#xff1a;使用network.service和Netwo…

Docker(十一)-Docker运行nginx1.10容器实例

1.下载镜像 docker pull nginx:1.102.直接启动实例(目的&#xff1a;复制出配置文件) 2.1启动实例 docker run -d -p 80:80 --namenginx1.10 nginx:1.102.2将容器内文件拷贝到本地目录 docker cp nginx1.10:/etc/nginx /software/nginx/将/software/nginx/nginx目录改为/so…

07 JSP

文章目录 JSP1、JSP 概述2、JSP 脚本和缺点3、EL 表达式4、JSTL标签5、MVC模式和三层架构6、案例 JSP 1、JSP 概述 JSP&#xff08;全称&#xff1a;Java Server Pages&#xff09;&#xff1a;Java 服务端页面 &#xff08;1&#xff09;是一种动态的网页技术 &#xff08;2&…

11 逻辑运算符

逻辑运算符 and、or、not 常用来连接条件表达式构成更加复杂的条件表达式&#xff0c;并且 and 和 or 具有惰性求值或逻辑短路的特点&#xff0c;当连接多个表达式时只计算必须要计算的值。 运算符 and 和 or 并不一定会返回 True 或 False &#xff0c;而是得到最后一个被计算…

WordPress主题追格企业官网主题免费开源版V1.1.6

追格企业官网主题免费开源版由追格开发的一款开源wordpress主题&#xff0c;专为企业建站和追格企业官网小程序&#xff08;开源版&#xff09;PC配套而设计&#xff0c;功能集新闻动态、留言反馈、产品与服务、公司简介、联系我们等模块。

【MySQL进阶篇】锁:全局锁、表级锁以及行级锁

一、锁的概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须要解决的一个问题&am…

Apache Doris + Paimon 快速搭建指南|Lakehouse 使用手册(二)

湖仓一体&#xff08;Data Lakehouse&#xff09;融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势&#xff0c;帮助用户更加便捷地满足各种数据处理分析的需求。在过去多个版本中&#xff0c;Apache Doris 持续加深与数据湖的融合&#xff0c;已演进出一套成熟…