Linux 设置core dump

最近本人负责项目中的流媒体转发模块,查了很多资料后选择了EasyDarwin作为转发服务器。编译源码之后服务器稳定运行了半个月,但是今天突然不能正常转发了。由于本人Linux新手,所以没有在Linux下调试代码的经验,在群主的指导下知道可以设置core文件来调试代码,于是几经周折完成了core文件的设置,特将过程记录下来。

什么是coredump

当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。

Linux下打开coredump

本人使用的Linux发行版是Ubantu 14.04,设置生成coredump文件的方法如下:

  • 打开core dump功能
    在终端中输入命令ulimit -c(也可以通过ulimit -a查看) 输出的结果为 0,说明默认是关闭 core dump 的,即当程序异常终止时,也不会生成 core dump 文件。
    Linux 设置core dump_第1张图片
    我们可以使用命令 ulimit -c unlimited 来开启 core dump 功能,并且不限制 core dump 文件的大小; 如果需要限制文件的大小,将 unlimited 改成你想生成 core 文件最大的大小,注意单位为 blocks(KB)。
    用上面命令只会对当前的终端环境有效,如果想需要永久生效,可以修改文件/etc/bash.bashrc文件,添加一行ulimit -c unlimited,然后执行命令source /etc/bash.bashrc生效。此时通过ulimit -a查看:
    Linux 设置core dump_第2张图片
    (有网友的资料是直接修改/etc/security/limits.conf文件,但是我测试了没有效果。)
  • 设置core文件保存路径
    默认生成的 core 文件保存在可执行文件所在的目录下,文件名就为 core,修改此文件名方法有两种:
    1、通过修改/proc/sys/kernel/core_uses_pid文件可以让生成 core 文件名是否自动加上 pid 号。命令如下:echo 1 > /proc/sys/kernel/core_uses_pid生成的 core 文件名将会变成 core.pid,其中 pid 表示该进程的 PID。

    2、还可以通过修改/proc/sys/kernel/core_pattern 来控制生成 core 文件保存的位置以及文件名格式。命令可以用 echo "/EasyDarwin/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern 设置生成的 core 文件保存在 /EasyDarwin/ 目录下,文件名格式为 “core-命令名-pid-时间戳”。其中:
    其中:

    • %c 转储文件的大小上限
    • %e 所dump的文件名
    • %g 所dump的进程的实际组ID
    • %h 主机名
    • %p 所dump的进程PID
    • %s 导致本次coredump的信号
    • %t 转储时刻(由1970年1月1日起计的秒数)
    • %u 所dump进程的实际用户ID

gdb调试core文件

产生了 core 文件,我们该如何使用该 Core 文件进行调试呢?Linux 中可以使用 GDB 来调试 core 文件,步骤如下:

  • 首先,写段错误代码,这个对程序猿来说很简单,使用 gcc 编译源文件,加上 -g 以增加调试信息;
#include

int main()
{
    int *p = NULL;
    *p = 2;
    printf("%d",*p);
    return 0;
}

编译:

gcc -g -o test test.c
  • 运行程序,以使程序异常终止时能生成 core 文件;
./test
  • 当core dump 之后,使用命令 gdb program core 来查看 core 文件,其中 program为可执行程序名,core 为生成的 core 文件名。
gdb test core

Linux 设置core dump_第3张图片

可以看到gdb直接定位到了程序中出错的具体行。至于具体gdb的使用方法本人也还在摸索之中。需要说明的是,要是EasyDarwin能在错误时产生core文件,需要使用./Built debug命令来编译源程序。最后感谢EasyDarwin群主的热心帮助。

你可能感兴趣的:(Linux)