关于Linux的core dump那些事

本文详细讲解了Linux中core文件的产生、设置、GDB调试方法,以及其在问题排查中的重要性。涉及coredump的开启、限制和路径设置,以及针对不同类型信号的处理。同时讨论了core文件的优缺点和应用技巧。

什么是core?

在linux中,程序运行时出现异常崩溃,操作系统会将程序当时的内存状态、调用堆栈等信息保存在core文件中。这种行为就是core dump(核心转储)。core文件中一般会保存寄存器信息(包括程序指针、栈指针等)、内存管理信息、CPU和操作系统状态和以及函数调用堆栈等信息。所以,core文件对于开发人员是非常重要的,很多时候我们都需要依赖对core文件的分析结合日志来定位和解决崩溃的问题。

core dump相关设置

在linux中,core dump的一些相关设置方法:

  • 查询:ulimit -c,查询结果为0则表示关闭core dump功能,系统默认是关闭的。
  • 关闭:ulimit -c 0
  • 打开:ulimit -c unlimited,不限制core文件大小,也可以限制指定大小,单位是blocks(一般为kB),如ulimit -c 100表示限制core文件大小为100k。
  • 修改core文件名生成规则:通过执行命令echo 1 > /proc/sys/kernel/core_uses_pid,可以将生成core文件的文件名改为core.pid。默认情况下,core dump生成的文件名为core,文件生成在程序当前目录下。且新的core会覆盖已存在的core。
  • 修改生成路径和文件名:通过修改/proc/sys/kernel/core_pattern可以控制core文件保存位置和文件格式。例如,通过命令echo “/tmp/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern将core文件保存在/tmp/corefile/目录下,文件名的格式为core-命令名-pid-时间戳.
  • core_pattern的命名参数如下:
%e dump的命令名
%p dump的进程PID
%t dump时间戳(由1970年1月1日起计的秒数)
%s 导致本次core dump的信号
%c 转储文件的大小上限
%g dump的进程的实际组ID
%u dump进程的实际用户ID
%h 主机名

产生core文件的必备条件

  • 环境变量的设置:通过前面介绍的ulimit –c等环境变量的设置打开core文件的生成限制。
  • 程序编译选项的设置:要产生 core 文件,编译器必须支持把当前进程的镜像以某种格式 dump 到一个文件中,常见的比如 gcc/g++ 的 -g 选项。
  • 崩溃时的特殊信号:Linux内核会根据进程退出时的信号的类型来决定是否要产生 core 文件。例如SIGSEGV、SIGABRT等信号会产生core,而SIGALRM、SIGPIPE等信号不会产生core。

GDB调试core文件

当程序core dump之后,使用命令gdb program core来查看 core 文件,其中 program 为可执行程序名,core 为生成的 core 文件名。然后执行bt(backtrace)命令查看函数的调用堆栈,定位崩溃产生的位置。其他gdb调试技巧在此不赘述。

core文件的缺点

  • 因为 core 文件是对当时进程地址空间的镜像,所以 core 文件大小一般都会比较大,这样很占用磁盘空间,而且如果要将文件从服务器上下载到本地分析也会比较耗时。
  • 对于缓冲区溢出导致的 coredump ,进程的调用堆栈已经被覆盖破坏了, core 文件显示的堆栈信息往往错误。
  • 程序因SIGALRM、SIGPIPE等信号崩溃,则不会产生 core 文件。
### 关于Linux环境下的Coredump机制源码 在Linux环境中,coredump机制允许当程序崩溃时保存内存映像到文件中以便后续分析。此功能由内核实现,并且涉及多个部分的工作。 核心逻辑位于`fs/binfmt_elf.c` 文件中的 `elf_core_dump()` 函数[^1]。该函数负责创建ELF格式的核心转储文件。它会遍历进程地址空间并收集必要的信息来构建有效的 ELF 文件结构。具体来说: - 需要处理同类型的段(segments),比如栈、堆以及加载的共享库等。 - 对于每个线程组成员都会调用一次这个函数以确保多线程应用能够正确生成 core file。 此外,在 `kernel/sys.c` 中定义了系统调用接口 `do_coredump()` ,用于触发实际的 coredump 过程[^2]。这里包含了对各种条件检查的支持,例如权限验证和大小限制设置等功能。 对于配置选项而言,可以通过 `/proc/sys/kernel/core_pattern` 来指定如何命名及存储产生的 core dump 文件;而通过修改 `/proc/<pid>/limits` 可调整单个进程中所能占用的最大资源量,从而间接影响能否成功生成完整的 core dump 数据[^3]。 ```c // fs/binfmt_elf.c static int elf_core_dump(long signr, struct pt_regs *regs) { ... } // kernel/sys.c SYSCALL_DEFINE0(coredump) { return do_coredump(current->signal->group_exit_code); } ``` 为了更深入理解整个流程,建议阅读官方文档中有关 "Core Dumps" 的章节[^4],这提供了更多背景知识和技术细节方面的指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值