Linux下的Core Dump

Core Dump文件

  • 当程序运行过程中异常终止或者崩溃了,操作系统会将当前的内存状态记录下来,保存在一个文件中,这就是Core Dump(核心转储);core文件会包含程序运行时的内存、寄存器状态,堆栈指针,内存管理信息和各种函数调用堆栈信息,可以理解为一个“内存快照”;通过这个core文件可以定位到程序异常退出时对应的堆栈调用信息,找出具体的问题所在。

Core Dump相关设置

core dump默认是不开启的,可以通过ulimit -c查看是否开启,若输出为0,则没有开启,可使用ulimit -c unlimited 开启core dump功能;
若输出为1,还需要查看详细信息,使用ulimit -a;

admin@localhost:~> ulimit -a
core file size          (blocks, -c) 1
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15902
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) 1741224
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) 15902
virtual memory          (kbytes, -v) 5833920
file locks                      (-x) unlimited

core file size的大小太小是不行的,系统不会产生core文件,大小最小为4,一般设置为unlimited;
ulimit相关选项

-a:显示目前资源限制的设定;
-c <core文件上限>:设定core文件的最大值,单位为区块;
-d <数据节区大小>:程序数据节区的最大值,单位为KB;
-f <文件大小>:shell所能建立的最大文件,单位为区块;
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-m <内存大小>:指定可使用内存的上限,单位为KB;
-n <文件数目>:指定同一时间最多可开启的文件数;
-p <缓冲区大小>:指定管道缓冲区的大小,单位512字节;
-s <堆叠大小>:指定堆叠的上限,单位为KB;
-S:设定资源的弹性限制;
-t <CPU时间>:指定CPU使用时间的上限,单位为秒;
-u <程序数目>:用户最多可开启的程序数目;
-v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。

core文件默认的存储位置与对应的可执行文件程序在同一目录下,文件名为core,可通过修改配置文件来设置core文件的路径;

echo "自己设置路径/core"> /proc/sys/kernel/core_pattern

默认core文件是没有后缀名的,当有多个程序崩溃时,就会覆盖掉上一个core文件,所以有必要对不同core文件进行重命名,同样可以通过修改配置文件:

echo "设置文件路径/core.%e.%p">/proc/sys/kernel/core_pattern

在配置文件/proc/sys/kernel/core_uses_pid也可以控制core文件的文件名,如果为1则表示店家pid作为扩展,如果为0,则表示没有扩展 名;可以直接修改配置文件:

echo "1" > /proc/sys/kernel/core_uses_pid

core_pattern相关参数

%p --dump进程的进程ID
%u --dump进程的实际用户ID
%g --dump进程的实际组ID
%s --导致本次core dump的signal号
%t --core dump的时间 (197011日计起的秒数)
%h --主机名
%e --程序文件名

使用gdb可以直接查看程序崩溃时的堆栈信息

gdb "可执行程序(所查询崩溃的程序)" core文件 #复现崩溃的程序
bt  									  #查看堆栈信息
gdb -c core.扩展名 "可执行程序(所查询崩溃的程序)"
where

产生Core Dump的几种情况

  • 1、内存访问越界
  • 2、多线程使用了线程不安全的函数
  • 3、多线程读写的数据为加锁保护
  • 4、使用非法指针
  • 5、堆栈溢出

linux支持的信号列表:

SIGHUP 1 A 终端挂起或者控制进程终止
SIGINT 2 A 键盘中断(如break键被按下)
SIGQUIT 3 C 键盘的退出键被按下
SIGILL 4 C 非法指令
SIGABRT 6 C 由abort(3)发出的退出指令
SIGFPE 8 C 浮点异常
SIGKILL 9 AEF Kill信号
SIGSEGV 11 C 无效的内存引用
SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道
SIGALRM 14 A 由alarm(2)发出的信号
SIGTERM 15 A 终止信号
SIGUSR1 30,10,16 A 用户自定义信号1
SIGUSR2 31,12,17 A 用户自定义信号2
SIGCHLD 20,17,18 B 子进程结束信号
SIGCONT 19,18,25 进程继续(曾被停止的进程)
SIGSTOP 17,19,23 DEF 终止进程
SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键
SIGTTIN 21,21,26 D 后台进程企图从控制终端读
SIGTTOU 22,22,27 D 后台进程企图从控制终端写
https://developer.aliyun.com/article/74174
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值