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

本文介绍了Linux系统中的coredump机制,包括其基本概念、常见错误类型,如何通过ulimit命令生成和配置coredump,以及使用GDB进行错误分析的步骤。还提供了排查coredump问题的实例和一些可能导致无法生成coredump的原因分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的基本知识 | 空间满了的解决方法

### 解决 `npm install vite-plugin-vue-setup-extend` 失败的方法 当遇到安装失败的情况时,可以尝试几种不同的方法来解决问题。 #### 使用 `--legacy-peer-deps` 参数 对于许多开发者而言,在命令末尾加上 `--legacy-peer-deps` 可以帮助绕过一些依赖版本不匹配的问题[^1]。因此,建议先尝试如下命令: ```bash npm install vite-plugin-vue-setup-extend --save-dev --legacy-peer-deps ``` #### 清理缓存并重试 有时本地的 npm 缓存可能会导致问题。清理缓存后再重新执行安装操作可能有助于解决该问题: ```bash npm cache clean --force npm install vite-plugin-vue-setup-extend --save-dev ``` #### 更新 Node.js 和 NPM 版本 确保使用的 Node.js 和 NPM 是最新稳定版也很重要。旧版本可能存在兼容性问题,影响插件或其他工具包的成功安装。 #### 检查错误日志中的具体提示 如果仍然无法完成安装,则需仔细查看完整的错误信息。例如,有报告指出更新依赖项过程中遇到了构建失败的问题,这可能是由于特定模块内部存在未定义导出引起的[^2]。针对这种情况,应该查找是否有官方文档提到解决方案或是社区内其他用户的反馈。 #### 配置 Webpack 或 Babel 插件 某些情况下,项目中使用的一些打包工具配置也可能引发冲突。比如,使用 `uglifyjs-webpack-plugin` 时可能出现编译期报错,这时考虑是否有必要引入 Babel 来处理这些第三方库文件[^3]。 通过上述措施通常能够有效应对大多数常见的安装难题。不过需要注意的是,具体情况还需根据实际发生的错误消息做适当调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值