在开发Linux的程序时,例如游戏服务器,有时会异常终止或者崩溃,此时没有任何日志,也不能定位到崩溃代码的位置,有些老手会告诉你去查看coredump,那什么是coredump, 又怎么查看呢?这里就跟大家讲一讲
什么是coredump
coredump是程序异常终止或崩溃时,操作系统将当时内存、寄存器、堆栈等数据记录下,并保存在一个文件中,可以简单理解成是一个快照文件
开启coredump功能
如果不知道是否开启coredump功能,可以在命令行中输入:ulimit -c , 如果返回的结果是0,表示没有开启coredump。
开启coredump的方法,可以输入命令: ulimit -c size 开启,size是文件大小,以blocks为单位,1个block为512bytes, 也可以设置成unlimited,表示不限制coredump文件的大小。
这种方法,只会在当前会话生效,可以将 ulimit 的命令加到 /etc/profile 中修改所有用户的环境变量。
还可以修改 /etc/security/limits.conf 文件 和 在程序中使用 setrlimit 函数来设置,笔者没有具体使用,这里就不详细介绍
修改coredump的保存路径
默认情况下,生成的coredump保存在可执行程序的当前目录下, 文件名为core.
有时候程序可能会反复崩溃,这样上次产生的coredump文件会被覆盖掉,这种情况,可以通过修改coredump的文件名和路径来解决,具体方法如下:
- 修改 /proc/sys/kernel/core_uses_pid 文件,将内容改为1. 可以使用core文件名自动加上pid, 此时core文件名将变成core.pid, pid为进程的PID
- 修改 /proc/sys/kernel/core_pattern 文件,例如内容修改为:/tmp/core.e%.%p.%t , 即表示将core文件保存到 /tmp目录,文件名为:core.可执行程序名称.进程PID.时间戳
以下为文件名参数列表:
- %p - 进程的pid
- %u - 当前的uid
- %g - 当前的gid
- %s - 产生coredump的信号
- %t - 产生coredump的时间戳
- %h - 主机名
- %e - 可执行文件的名称
查看coredump文件
查看coredump文件有很多工具,这里简单讲一下使用gdb查看
例如当程序 cli发生崩溃,产生coredump文件为core,可以使用下面的命令查看
gdb -c ./core cli
然后输入bt full, 就可以查看到详细的调用栈,这样就可以根据显示的信息,找到崩溃的地方。