core dump文件

本文详细介绍了Linux系统下coredump文件的管理,包括如何开启和关闭coredump功能,设置生成大小限制,指定文件名格式和生成路径。此外,还讲解了如何解析coredump文件以进行调试,利用gdb查看堆栈信息和汇编代码,帮助开发者定位程序错误。

core dump文件
core dump 又叫核心转储,是一个程序运行时的环境一个集合包,包含崩溃时的堆栈信息,是一个二进制文件,没法使用记事本打开,通常会在指定目录下生成一个core文件。core文件仅仅是一个内存映象,主要用来调试。
core dump文件的生成和大小限制
linux系统more默认关闭coredump文件的生成,由于须要占用一部分系统开销。
检查系统core dump功能是否开启,0为关闭html

[root@vsftpd ~]# ulimit -c
0

查询结果为0,表示关闭了此功能。linux

查看详细显示信息web

[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

开启core dump功能
临时开启core dump功能,重启或者从新登陆会失效。redis

[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

登出从新链接便可生效sass

指定core dump文件的名称格式
默认状况下系统生成的core dump文件不带其余拓展名,所有命名为core。此时新生成文件会覆盖掉旧的core文件;
core dump文件的参数说明bash

%% 单个%字符
%p dump进程的进程ID
%u dump进程的用户ID
%g dump进程的组ID
%s 致使core dump的信号
%t core dump 的时间
%h 主机名
%e 程序文件名网络

使core文件名称是否带有pid,配置文件/proc/sys/kernel/core_uses_pid的内容为1,添加pid,0为不添加pid;svg

[root@vsftpd ~]# more /proc/sys/kernel/core_uses_pid 
1

定义core文件的名称格式为core-%e-%p-%t,配置文件默认文件名为core测试

[root@vsftpd ~]# more /proc/sys/kernel/core_pattern 
core
[root@vsftpd ~]# echo 'core-%e-%p-%t' > /proc/sys/kernel/core_pattern
[root@vsftpd ~]# more /proc/sys/kernel/core_pattern 
core-%e-%p-%t

指定core dump文件的生成路径
系统默认的core文件生成路径是/var/logs,但/var/logs目录并不是系统自带的,系统初始安装默认自带的是/var/log,最终致使该系统出现core dump后并没能生成core文件。指定core dump文件存在/dump/目录下,格式自定义

[root@vsftpd ~]# mkdir /dump/
[root@vsftpd ~]# echo '/dump/core-%e-%p-%t' > /proc/sys/kernel/core_pattern
[root@vsftpd ~]# more /proc/sys/kernel/core_pattern 
/dump/core-%e-%p-%t
[root@vsftpd ~]#

关闭core dump文件的生成
临时关闭core dump文件的生成功能

[root@vsftpd ~]# ulimit -c 0
[root@vsftpd ~]# ulimit -c
0

永久关闭core dump功能,须要修改配置文件/etc/security/limits.conf

[root@vsftpd ~]# more  /etc/security/limits.conf
*               soft    core             0

测试生成core dump文件

在linux系统下,若是send、recv、write在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。core dump文件通常是在收到某个信号的时候结束产生,若是不指定特定的信号,应用程序按默认方式处理,默认处理的信号以下:

3) SIGQUIT      4) SIGILL       5) SIGTRAP   6) SIGABRT      7) SIGBUS       8) SIGFPE                 11) SIGSEGV   31) SIGSYS   24) SIGXCPU     25) SIGXFSZ    29) SIGIO

利用默认信号生成core dump文件

[root@vsftpd ~]# kill -s SIGSEGV  $$
[root@vsftpd ~]# file /dump/core-bash-3120-1562140702 
/dump/core-bash-3120-1562140702: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from '-bash', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: '/bin/bash', platform: 'x86_64'

利用C编译生成core dump文件小程序

[root@vsftpd ~]# more a.c
#include <stdio.h>
int main()
{
char *ptr="linuxers.cn";
*ptr=0;
}
编译运行程序
[root@vsftpd ~]# gcc -g -o 1 a.c
[root@vsftpd ~]# ./1
Segmentation fault (core dumped)
[root@vsftpd ~]# file /dump/core-1-3295-1562141671 
/dump/core-1-3295-1562141671: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './1', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: './1', platform: 'x86_64'

解析core dump文件

使用gdb解析core dump文件

安装gdb

[root@vsftpd ~]# gdb
-bash: gdb: command not found
[root@vsftpd ~]# yum install -y gdb.x86_64

gdb进行查看core文件的内容, 以定位文件中引起core dump的行;

gdb格式以下:
gdb [exec file] [core file]
[exec file]表示以前使用gcc编译的程序
[core file]表示以前产生的dump文件

使用gdb查看core dump文件

[root@vsftpd ~]# gdb ./1 /dump/core-1-3295-1562141671 
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-114.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/1...done.
[New LWP 3295]
Core was generated by `./1'.
Program terminated with signal 11, Segmentation fault.
#0  0x00000000004004dd in main () at a.c:5
5       *ptr=0;
Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.5.x86_64

利用gdb命令进行调试

查看调用堆栈信息

(gdb) bt
#0  0x00000000004004dd in main () at a.c:5

查看出现问题时的汇编代码

(gdb) disass
Dump of assembler code for function main:
   0x00000000004004cd <+0>:     push   %rbp
   0x00000000004004ce <+1>:     mov    %rsp,%rbp
   0x00000000004004d1 <+4>:     movq   $0x400580,-0x8(%rbp)
   0x00000000004004d9 <+12>:    mov    -0x8(%rbp),%rax
=> 0x00000000004004dd <+16>:    movb   $0x0,(%rax)
   0x00000000004004e0 <+19>:    pop    %rbp
   0x00000000004004e1 <+20>:    retq   
End of assembler dump.

查看对应寄存器的值

(gdb) info reg
rax            0x400580 4195712
rbx            0x0      0
rcx            0x4004f0 4195568
rdx            0x7ffc9fe2d5d8   140722990929368
rsi            0x7ffc9fe2d5c8   140722990929352
rdi            0x1      1
rbp            0x7ffc9fe2d4e0   0x7ffc9fe2d4e0
rsp            0x7ffc9fe2d4e0   0x7ffc9fe2d4e0
r8             0x7f1982996e80   139747542003328
r9             0x0      0
r10            0x7ffc9fe2cfe0   140722990927840
r11            0x7f19825f12e0   139747538178784
r12            0x4003e0 4195296
r13            0x7ffc9fe2d5c0   140722990929344
r14            0x0      0
r15            0x0      0
rip            0x4004dd 0x4004dd <main+16>
eflags         0x10246  [ PF ZF IF RF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0

 

### 如何生成和分析 Core Dump 文件 #### 配置 `ulimit` 以启用 Core Dump 文件生成 在 Linux 系统中,默认情况下可能未启用核心转储功能。为了允许生成 Core Dump 文件,可以通过调整 `ulimit` 参数实现。具体操作如下: 运行以下命令以查看当前系统的 Core Dump 大小限制: ```bash ulimit -c ``` 如果返回值为 `0`,则表示禁用了 Core Dump 功能。要启用该功能,需设置其大小无限制(或其他适当值)。例如: ```bash ulimit -c unlimited ``` 这一步骤确保当程序崩溃时能够生成完整的 Core Dump 文件[^1]。 #### 设置 Core Pattern 定义文件路径 Core Dump 的存储位置及其命名方式由 `/proc/sys/kernel/core_pattern` 控制。编辑此配置项可以让系统自定义 Core Dump 文件的位置与名称格式。常见的占位符包括 `%e` 表示可执行文件名、`%p` 进程 ID 和其他选项如时间戳 `%t` 等[^4]。 修改方法如下所示: ```bash echo "/tmp/core-%e.%p" | sudo tee /proc/sys/kernel/core_pattern ``` 上述例子会将所有的 Core Dumps 存放在临时目录下,并附加应用程序的名字及 PID 来区分不同实例产生的数据[^3]。 #### 使用 GDB 调试 Core Dump 文件 一旦捕获到了一个有效的 Core Dump 文件之后,就可以利用 GNU Debugger (GDB) 对其展开深入研究了。基本流程涉及加载目标二进制镜像连同对应的 Core 数据一起载入调试器环境之中。 启动 GDB 并指定需要审查的目标应用以及关联的核心记录作为输入参数之一即可开始工作流: ```bash gdb ./application_binary_path core_dump_file_name ``` 进入交互界面后尝试一些基础指令来探索现场状态,比如打印栈回溯信息(`bt`)或者检查特定变量的内容等等[^2]: ```plaintext (gdb) bt full # 显示整个调用堆栈详情 (gdb) frame N # 切换至第N层帧上下文中 (gdb) print var # 输出某个局部或全局量var的具体数值表现形式 ``` 通过以上步骤便能有效地定位问题所在并采取相应措施加以修正。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值