一、简介
当linux程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。
在公司发现生成的core文件都带有进程名称、进程ID、和时间,这又是怎么做到的呢?
二、core dump配置
1、使用ulimit命令开启core dump
"ulimit -c" 检查是否开启core dump,返回0表示没开启,返回unlimited表示已经开启
[root@vsftpd ~]# ulimit -c
0
"ulimit -c unlimited"开启core dump功能,"ulimit -c num"限制生成的dump文件大小
[root@vsftpd ~]# ulimit -c unlimited #生成文件大小不受限制
[root@vsftpd ~]# ulimit -c
unlimited
[root@vsftpd ~]# ulimit -c 1024 #限制生成coredump文件大小为1024K
[root@vsftpd ~]# ulimit -c
1024
上述开启只对当前终端临时有效,永久开启core dump功能,需要修改配置文件/etc/security/limits.conf
[root@vsftpd ~]# more /etc/security/limits.conf
* soft core unlimited
"ulimit -a"显示详细信息
[root@vsftpd ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7200
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7200
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
2、配置core dump文件存储的路径
core文件默认的存储位置与对应的可执行程序在同一目录下,文件名是core,大家可以通过下面的命令看到core文件的存在位置:
cat /proc/sys/kernel/core_pattern
通过下面的命令可以更改coredump文件的存储位置,若你希望把core文件生成到/data/coredump/core目录下:
echo “/data/coredump/core”> /proc/sys/kernel/core_pattern
3、配置core dump文件存储的路径
同一个程序多次崩溃,就会重复覆盖同一个core文件,因此我们有必要对不同程序生成的core文件进行分别命名
例如,使用下面的命令使kernel生成名字为core.filename.pid格式的core dump文件:
echo “/data/coredump/core.%e.%p” >/proc/sys/kernel/core_pattern
其中%e指的是程序文件名,%p指的是进程id。其他常用的如下表:
- %% 单个%字符
- %p dump进程的进程ID
- %u dump进程的用户ID
- %g dump进程的组ID
- %s 导致core dump的信号
- %t core dump 的时间
- %h 主机名
- %e 程序文件名
三、core dump文件分析
产生了 core 文件,我们该如何使用该 Core 文件进行调试呢?Linux 中可以使用 GDB 来调试 core 文件,步骤如下:
- 首先,使用 gcc 编译源文件,加上
-g
以增加调试信息; - 按照上面打开 core dump 以使程序异常终止时能生成 core 文件;
- 运行程序,当core dump 之后,使用命令
gdb program core
来查看 core 文件,其中 program 为可执行程序名,core 为生成的 core 文件名。
常用的GDB命令:
bt(backtrace),查看调用堆栈信息
where,查看当前程序调用函数栈帧
disass,查看出现问题时的汇编代码
info reg,查看对应寄存器的值
l(list) ,显示源代码,并且可以看到对应的行号;
b(break)x, x是行号,表示在对应的行号位置设置断点;
p(print)x, x是变量名,表示打印变量x的值
r(run), 表示继续执行到断点的位置
n(next),表示执行下一步
c(continue),表示继续执行
q(quit),表示退出gdb
ref:
gdb调试命令及使用gdb调试core dump文件 - 行运换甲 - 博客园
linux下core dump【总结】 - Rabbit_Dale - 博客园
linux下生成core dump方法与gdb解析core dump文件_Dream wedding-CSDN博客_gdb生成coredump文件
linux下core dump【总结】 - Rabbit_Dale - 博客园