当前位置:C++技术网 > 精选软件 > Linux使用coredump文件调试系列:1 设置生成coredump文件

Linux使用coredump文件调试系列:1 设置生成coredump文件

更新时间:2018-12-05 16:45:38浏览次数:1+次

    coredump调试是Linux系统的一个非常有用的调试工具。在上线之后的程序运行过程中,我们无法实时调试,程序一旦崩溃,我们很难知道是什么问题引起的,而coredump就为了准备好了崩溃时候的情况,供我们调试使用。

    那么coredump是什么呢?coredump是一个程序运行时的环境的一个集合,包含了崩溃时的堆栈信息。这个文件是二进制文件,无法用记事本打开。对于这么高大上的技术,其实我开始是拒绝的。后来尝试过一次,发现整了几圈,没有整成功。因为开发时VS可以实时调试,所以也降低了研究这个技术的需求。是的,你没有猜错,我是用VS在写Linux程序,当然也包括了用VS调试Linux程序咯。准确来说,我是使用VS2017在写Linux程序以及调试。有兴趣的朋友,可以阅读《VS2017开发Linux项目的过程:从创建项目到调试运行全程指导》。

    那为什么我现在又要研究coredump技术了呢?因为需要!VS2017开发时候调试非常好用,就和Windows本地程序开发一样,非常方便。可能这是原生Linux程序员没有体会过的吧。哈哈哈。为什么需要呢?程序写好了,放在服务器上运行了。然而不知道什么原因,就突然崩溃了。这种问题往往没有办法直接复现,所以非常的难受。就好像是你感觉身上有一个地方很痒,但是抓哪里都抓不到的样子。如果知道是某种情况下能复现,VS2017还是非常不错的选择的。

    既然如此,只能退而求其次,我们只能借助coredump技术来事后调试,只要能解决问题,难一点也是愿意的。所以借此机会,将这一方面的内容总结分享一下。

    默认情况下,一般Linux系统会关闭coredump文件的生成的,毕竟是要占用一定的系统开销的。所以我们要想办法开启这个黑科技。在开启之前,我们要先确认一下我们的系统是否已经开启了。

1.确认系统是否开启coredump

输入命令:ulimit -a 或 ulimit -c

在返回的结果里,前者如:

core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15245
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 15245
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

后者直接显示:

unlimited

    或是一个数字

    这样就表明是已经开启了的。如果没有开启,前面返回的结果的第一行和后者返回的结果都是0.

2.没有开启coredump,这一步来开启coredump

    如果是临时开启一下coredump,执行一下命令:

ulimit -c unlimited

    这样就可以了。但是退出登录或者系统重启后,这个设置就会失效。所以我们一般长期需要,自然要长期设置,也就是要将设置写入到配置文件里。

    对于修改配置文件,我们就采用最简单的方式了,直接写成脚本,然后自己执行一下,退出重新登陆,配置就生效了。

    而配置文件的大致思路:先将要生成coredump文件的设置写入配置文件(/etc/security/limits.conf)中;然后要指定一个存储coredump文件的位置,也就是要重定向coredump存储的位置,否则的话就算生成了coredump文件,你也很难找到啊,所以你还得先创建一个目录;最后要重新加载配置文件,再次登录就可以生效了。有可能重新加载配置文件之后就已经生效了,以测试为准。

    下面是这个shell脚本的完整内容(复制保存为.sh文件):

#!/bin/bash
# 让coredump文件对所有用户有效
echo -e "# enable coredump whith unlimited file-size for all users\n* soft core unlimited" >> /etc/security/limits.conf
# 设置coredump文件的位置,在目录/data下创建corefile目录,并启用目录权限
cd /data && mkdir corefile && chmod 777 corefile
# 格式化coredump文件名
# %e – 程序文件名 
# %s – 收到的信号,看看进程是如何把杀死的,不同的信号值表示不同的崩溃场景 
# %p – 进程号
# %t – 时间戳,区别多个core文件,这个时间戳值不好看时间,要看时间还是看文件系统的时间
# 每次重启后,由于proc目录是动态更新的,所以系统会初始化core_pattern的值。
echo -e "kernel.core_pattern=/data/corefile/core-%e-singal(%s)-pid(%p)-ts(%t)" > /etc/sysctl.conf
#设置好后重新加载配置
sysctl -p /etc/sysctl.conf

    执行了这个脚本,最好是执行logout退出后再登陆,确保生效。需要注意的是,你要实现创建好/data目录哦,如果重新执行这个脚本,要删除/data/corefile/目录哦。当然了,这个脚本你可以随意改成自己需要的。

    那么到此,就大功告成了。

    最后需要交代一点,开启了coredump,不代表程序崩溃就会有coredump,在gcc或g++编译时加入-g选项哦。

    PS:需要感谢CentOS开启coredump转储并生成core文件的配置这篇文章的作者vfhky,是他这篇文章给予了我尝试的动力。这是一篇高质量的的文章,但是不够详细,对于新手来讲,还是靠蒙靠试。所以我写了这篇分享出来。