详细分析Linux中的core dump异常(附 Demo排查)

目录

  • 1. 基本知识
  • 2. 进阶知识
  • 3. Demo
  • 4. 彩蛋

1. 基本知识

Core dump 是指在程序异常终止时,操作系统将程序的内存映像保存到磁盘上的一种机制。
在 Linux 系统中,core dump 提供了一种调试程序错误的重要方式,它记录了程序在崩溃时的内存状态,可以帮助开发人员定位问题

常见的 core dump 错误通常是程序在运行过程中发生了严重的错误或异常,导致操作系统强制终止了程序并生成了 core dump 文件。以下是一些常见的导致 core dump 的错误:

  • 段错误(Segmentation fault)
    程序访问了无效的内存地址,比如试图访问未分配的内存或者已经释放的内存
  • 空指针引用(Null pointer dereference)
    程序试图使用空指针(null pointer)访问内存中的数据时,会导致空指针引用错误
  • 内存访问越界(Out of bounds memory access)
    程序试图访问数组或者其他数据结构超出其边界范围的内存,就会发生内存访问越界错误
  • 使用已释放的内存(Use after free)
    程序试图在已经释放的内存地址上进行读取或写入操作时,就会发生使用已释放的内存错误
  • 栈溢出(Stack overflow)
    程序递归调用层数过深或者在栈上分配了过多的内存时,会导致栈溢出错误
  • 除以零(Division by zero)
  • 无效的指令或操作码(Invalid instruction or opcode)
    执行了不存在或无效的机器指令或操作码,会导致无效指令错误
  • 硬件故障或操作系统错误:如内存损坏、内核崩溃等情况

2. 进阶知识

一、怎么生成 core dump?

使用 ulimit 命令来控制生成 core dump 的条件,比如通过 ulimit -c unlimited 命令来设置允许生成任意大小的 core dump

先查看系統默认:ulimit -c 命令用于显示当前用户的 core dump 文件的大小限制。输出结果的含义如下:

  • 数字(以 KB 为单位),表示当前用户允许生成的 core dump 文件的最大大小限制
  • unlimited,表示当前用户允许生成任意大小的 core dump 文件
  • 0,表示当前用户不允许生成 core dump 文件

截图如下:

在这里插入图片描述

核心转储文件的大小通常受到操作系统或系统管理员配置的限制,可以使用 ulimit 命令来调整生成 core dump 文件的最大大小

二、core文件含义以及相关参数?

  • 程序崩溃时生成的二进制文件,其中包含了程序崩溃时的内存映像,以及当前的寄存器状态等信息
  • 一般存储在当前工作目录下,文件名通常为 core 或者 core.<pid>,其中 <pid> 是崩溃程序的进程 ID

相关的配置参数如下:

修改 /proc/sys/kernel/core_pattern 文件来配置 core dump 文件的生成路径和文件名格式
通过 ulimit -c 命令来设置 core 文件的最大大小限制

三、如何分析core dump文件?

使用 GNU Debugger (GDB) 等调试工具来分析 core dump 文件。通过加载 core 文件和对应的可执行文件,可以获取崩溃时的堆栈跟踪、变量值等信息,帮助定位程序错误
使用 gdb <executable> <corefile> 命令来加载可执行文件和 core 文件,并进入 GDB 调试环境

3. Demo

要排查 core dump,通常需要分析 core 文件以及程序的源代码。以下是排查 core dump 的一般步骤:

  1. 获取 core 文件
    程序发生 core dump 时,会在当前工作目录下生成一个 core 文件(除非已经配置了不同的路径)。首先要做的是获取这个 core 文件
  2. 分析 core 文件
    使用 GDB 命令查看堆栈跟踪、变量值等信息,从而确定程序崩溃的位置和原因
  3. 定位问题
    根据分析结果,确定程序崩溃的具体原因()内存访问错误、空指针引用、数据结构损坏等)
    分析代码,找出导致错误的代码段。
  4. 修复问题
    根据定位到的问题,修改程序代码以修复错误(涉及到修复内存管理错误、增加错误检查和处理逻辑等)
  5. 测试和验证
    各种测试技术,如单元测试、集成测试等,以确保程序的稳定性和可靠性

下面是一个简单的示例,演示如何排查一个导致 core dump 的 C 程序:

#include <stdio.h>void cause_crash() {char *ptr = NULL;*ptr = 'A';  // 尝试在空指针上进行写操作,导致段错误
}int main() {cause_crash();return 0;
}
  1. 编译该程序:gcc -o demo demo.c

  2. 执行程序,会触发 core dump:./demo

  3. 使用 GDB 分析 core 文件:gdb ./demo core

  4. 在 GDB 中可以使用命令 bt 查看堆栈跟踪:

(gdb) bt
#0  0x00005555555546e8 in cause_crash () at demo.c:6
#1  0x0000555555554701 in main () at demo.c:11

通过分析堆栈跟踪,可以发现问题出现在 cause_crash 函数的第 6 行,即空指针引用导致了段错误。在这个示例中,问题相对简单,修复方法可能是在写操作前添加对指针的空指针检查

4. 彩蛋

无法生成一个core-dump文件,有好些原因
在这里插入图片描述

一开始以为是被限制的文件大小或者不让他输出导致

查看core file size的大小
在这里插入图片描述
此处更改为无限制看看

在这里插入图片描述

后续发现此类问题还有一种原因:(挂载点的内存无可用,导致一直写入不进)

推荐阅读:【Linux】详细分析/dev/loop的基本知识 | 空间满了的解决方法

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

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

相关文章

Codeup_1132:问题 A: 最长公共子序列

目录 Problem DescriptionInputOutputSample InputSample Output原题链接解题思路代码实现&#xff08;C&#xff09; Problem Description 给你一个序列X和另一个序列Z&#xff0c;当Z中的所有元素都在X中存在&#xff0c;并且在X中的下标顺序是严格递增的&#xff0c;那么就…

伦敦银交易技巧:复合汇聚区域的应用

在伦敦银交易中我们需要掌握一些交易技巧&#xff0c;有了交易技巧我们才看得懂市场走势&#xff0c;进而作出适合我们的交易选择。下面我们就来讨论一个关于复合汇聚区域的伦敦银交易技巧。 相信很多人都学过支撑阻力位这个伦敦银交易技巧。一般来说&#xff0c;在伦敦银交易中…

ForkJoinPool在生产环境中使用遇到的一个问题

1、背景 在我们的项目中有这么一个场景&#xff0c;需要消费kafka中的消息&#xff0c;并生成对应的工单数据。早些时候程序运行的好好的&#xff0c;但是有一天&#xff0c;我们升级了容器的配置&#xff0c;结果导致部分消息无法消费。而消费者的代码是使用CompletableFutur…

C++初学者:如何优雅地写程序

我喜欢C语言的功能强大&#xff0c;简洁&#xff0c;我也喜欢C#的语法简单&#xff0c;清晰&#xff0c;写起来又方便好用。 一、为什么不用C语言写程序。 C语言用来做题目&#xff0c;考试研究是很方便的&#xff0c;但是用来写程序做软件&#xff0c;你就会发现&#xff0c…

Altair(澳汰尔) Radioss® 评估和优化动态载荷下的高度非线性问题

Altair&#xff08;澳汰尔&#xff09; Radioss 评估和优化动态载荷下的高度非线性问题 Radioss 是一款超前的分析解决方案&#xff0c;可评估和优化动态载荷下的高度非线性问题。它广泛应用于全球各行各业&#xff0c;能有效提高复杂设计的耐撞性、安全性和可制造性。 30 多…

Idea与DataGrip各版本通用破解码,无需脚本。

直接输入即可。若失效&#xff0c;访问网址http://idea521.com/即可获取新的破解码。亲测好用。 Idea与DataGrip是一个公司的产品&#xff0c;这里的破解码可通用。 破解码一&#xff1a; 375XQD8EO2-eyJsaWNlbnNlSWQiOiIzNzVYUUQ4RU8yIiwibGljZW5zZWVOYW1lIjoi5YWo5a625qG2IHd…

PMBOK第八版、项目管理AI标准...PMI标准今年有这些进展

项目管理实践标准不断在演变&#xff0c;PMI作为项目管理领域的权威机构&#xff0c;一直致力于与全球各行各业的项目实践者一同探索和研究最新的行业标准&#xff0c;确保PMI标准符合全球项目专业人士当前能力建设与职业发展的需要。 今年以来&#xff0c;我们发布了一系列PM…

Python接口自动化pytest框架安装

1、创建一个requirements.txt文件夹 2、输入内容&#xff1a;如下图 pytest pytest-html pytest-xdist pytest-ordering pytest-rerunfailures pytest-base-url allure-pytest3、在terminal中输入安装命令&#xff1a;pip install -r requirements.txt 安装成功 4、在termina…

JavaScript混淆工具选择与使用指南

摘要 本文介绍了什么是js混淆工具&#xff0c;以及为什么需要使用js混淆工具。详细解释了js混淆工具的实现原理和作用&#xff0c;探讨了如何选择合适的js混淆工具&#xff0c;列举了几款常用的js混淆工具&#xff0c;并对它们的特点和适用场景进行了分析。最后总结了js混淆工…

HAL库 DMA +USART收发数据

DMA 首先&#xff0c;DMA相当于CPU的弱智小助手&#xff0c;不会复杂的逻辑运算&#xff0c;不占用CPU的时间&#xff0c;DMA就是一个数据搬运工。 串口收发数据&#xff0c;不外乎就是&#xff0c;CPU需要发数据时&#xff0c;将数据丢给DMA,完事就不管了&#xff0c;收数据是…

有关Kitchen-Rosenfeld角点检测的公式推导

第一次看到下面这个公式时,不太清楚怎么推导过来的 后面看了有关Kitchen-Rosenfeld的文章后,明白了 假设梯度的角度 θ \theta θ tan ⁡ θ = I y I x \tan \theta =\frac{I_y}{I_x} tanθ=Ix​Iy​​ 其中 I y I_y Iy​为y偏导, I x I_x Ix​为x偏导, I x x I_{xx} I…

PTA-练习9

目录 实验10-4 递归实现顺序输出整数 实验10-10 十进制转换二进制 实验10-6 递归求简单交错幂级数的部分和 实验11-1-2 输出月份英文名 实验11-1-6 指定位置输出字符串 实验11-1-8 查找子串 递归的基本思路&#xff1a; 推出递归的条件或者进入递归的条件每层递归需要执行…

mysql的单表、多表查询和数据类型

一、MySQL数据库表操作 MySQL表的基本概念 在windows中有个程序叫做excel. 而Excel文件中存在了如sheet1、sheet2、sheet3的表, 所有的sheet都存储在这个Excel文件中, 在某个sheet中有相应的数据. 回到数据库和表的关系上来说, 这个Excel文件就是一个数据库, 所有的sheet就是…

数学分析复习:实数项级数的收敛

文章目录 实数项级数收敛1. 定义、性质2. 实数项级数的Cauchy收敛准则3. 正项级数的收敛判别法3.1 控制收敛定理&#xff08;比较判别法&#xff09;3.2 Cauchy判别法&#xff1a;3.3 dAlembert&#xff08;达朗贝尔&#xff09;判别法3.4 Raabe&#xff08;拉贝&#xff09;判…

Js全部循环方法解析

forEach方法 没有返回值&#xff0c;与 for 循环没有什么区别。 [1,2,3,4,5,6,7,8,9,0].forEach(item > {console.log(item); })map方法 返回一个新数组&#xff0c;不改变原数组。通过return内的操作后的数据 const newArr [1,2,3,4,5,6,7,8,9,0].map(item > {retu…

html页面使用@for(){},@if(){},利用jquery 获取当前class在列表中的下标

基于以前的项目进行修改优化&#xff0c;前端代码根据List元素在html里进行遍历显示 原先的代码&#xff1a; 其中&#xff0c;noticeGuide.Id是标识noticeGuide的唯一值&#xff0c;但是不是从0开始的【是数据库自增字段】 但是在页面初始化加载的时候&#xff0c;我们只想…

linux系统Kubernetes工具ingress暴露服务

Ingress Ingressingress详解创建 Ingress 资源部署 Ingress 控制器&#xff08;Nginx&#xff09;下载ingress controller创建ingress-controller测试ingress创建两个应用和service配置ingress转发文件 修改ingress转发类型 Ingress 暴露服务基于域名的虚拟主机 Ingress 》ing…

perl:web 自动化测试

使用 perl 编程语言进行 web自动化测试和开发的技术。Perl是一种通用的脚本语言&#xff0c;广泛用于web开发、系统管理和网络编程等领域。在web自动化中&#xff0c;Perl可以用于编写脚本来模拟用户在网页上的操作&#xff0c;例如点击按钮、填写表单、提交数据等&#xff0c;…

JMeter 环境安装及配置

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

蓝桥杯算法基础(30):尺取法的应用(hiho字符串),next数组应用(前缀周期性)

尺取法应用题hiho字符串 如果一个字符串恰好包含2个h,1个‘1’和1个‘0’&#xff0c;我们就称这个字符串是hiho字符串 例如"oihateher"、“hugeinputhugeoutput”都是hiho字符串 现在给定一个只包含小写字母的字符串S&#xff0c;小H想知道S的所有子串中&#xff0c…