linux core dump学习

本文深入探讨Linux内核dump的原理、配置方法及其应用,包括coredump的生成、检查和利用,为开发者提供全面的指导。

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

 

linux core dump学习

分类: linux学习笔记   643人阅读  评论(0)  收藏  举报

1. core dump是什么?
core dump又叫核心转储,当操作系统收到特定的signal时,
会生成某个进程的core dump文件。这样程序员可以根据
已经生成的core dump文件来debug查错。
gdb -c core_file ./main
bt
这样就能看到函数的调用栈了,不过很多时候这个调用栈信息
对debug来讲可能是没用的。

2. 如何确认linux系统是否启动了core dump功能?
通过ulimit -c来查看,如果是0说明core dump功能是关着的;
如果是unlimited则说明系统已经打开了core dump功能。

3. 如何开启或关闭core dump功能?
ulimit -c unlimited用来开启core dump功能;
ulimit -c 0则用来关闭core dump功能。

4. umilit命令是干什么的?
ulimit命令通过一些参数选项来管理不同种类的系统资源,
比如-c选项即用来指定core文件的大小。
所以通过ulimit -c可以查看当前系统已经设定的core文件的大小;
通过ulimit -c unlimited可以设置core文件为无限大,也就是
启动了core dump功能了。
ulimit -a可以显示所有的limit信息。

5. 当程序crash时,core dump文件会放到哪里去?
cat /proc/sys/kernel/core_pattern可以查看core dump文件的放置位置,
用户可以根据需要自行设定。例如用户想要将core dump文件放到USB
根目录,可以通过如下的命令来设定:
echo /mnt/usb/sda1/core_%e_sig%s_pid%p > /proc/sys/kernel/core_pattern,
其中%e,%s,%p是core_pattern可以设置的格式符,%e表示命令名,
%s表示产生core dump的signal,%p表示产生core dump的process的PID。

6. 哪些情况不会产生core dump文件?
linux很多signal默认都会产生core dump文件的,
关于这部分我们会放到linux signal那里做详细的讨论,
此处省略一千字。

7. 如何测试所做的core dump配置是否正确?
ulimit -c unlimited
echo /mnt/usb/sda1/core_dump > /proc/sys/kernel/core_pattern
echo 1 > /proc/sys/kernel/core_uses_pid
做了以上设置后,再:
ulimit -c
cat /proc/sys/kernel/core_pattern
cat /proc/sys/kernel/core_uses_pid
查看设置是否正确。如果设置都正确的话,
先用ps -A | grep process_name找到需要测试的process的PID。
kill -11 pid向pid这个process发生SIGSEGV。由于core dump文件
通常都很大,所以稍等一会你再去检查/mnt/usb/sda1/,你会发现
下面多了一个类似于core_xx的文件了。
由于SIGSEGV的默认动作会产生core dump文件,所以首先你得确保
你的process没有去接管SIGSEGV,这样kernel才会默认去处理。
如果你的process接管了这个signal,那你可以用其它的一些signal
做实验,因为默认会产生core dump文件的signal有很多。

8. core dump的应用有哪些?
(1) process不预期的崩溃掉。这时如果能取到core dump文件的话,
对解决问题可能会有很大帮助;
(2) 程序卡住或死锁时,发送诸如SIGSEGV等能够默认产生core dump
文件的signal给你的process。借助于core dump文件,可能会高效的
解决问题。
关于core dump的应用,后续有条件会再补充一些实验及实验结果。

9. /proc/PID/coredump_filter是用来干什么的?
sh-# cat /proc/506/coredump_filter
00000023
sh-#

可以通过
# man core
命令来查看,core dump filter中的每个bit对应一种类型的数据,比如:
bit0 dump anonymous private mappings.
bit1 dump anonymous shared mappings.
...
设定了相应的bit,即意味着进程崩溃时相应类型的内存数据就会dump下来。
通常core dump filter的设定值为3.
# echo 3 > /proc/<PID>/coredump_filter

### 关于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、付费专栏及课程。

余额充值