乐趣区

关于linux:关于Linux的core-dump那些事

什么是 core?

在 linux 中,程序运行时出现异常解体,操作系统会将程序过后的内存状态、调用堆栈等信息保留在 core 文件中。这种行为就是 core dump(外围转储)。core 文件中个别会保留寄存器信息(包含程序指针、栈指针等)、内存治理信息、CPU 和操作系统状态和以及函数调用堆栈等信息。所以,core 文件对于开发人员是十分重要的,很多时候咱们都须要依赖对 core 文件的剖析联合日志来定位和解决解体的问题。

core dump 相干设置

在 linux 中,core dump 的一些相干设置办法:

  • 查问:ulimit -c,查问后果为 0 则示意敞开 core dump 性能,零碎默认是敞开的。
  • 敞开:ulimit -c 0
  • 关上:ulimit -c unlimited,不限度 core 文件大小,也能够限度指定大小,单位是 blocks(个别为 kB),如 ulimit -c 100 示意限度 core 文件大小为 100k。
  • 批改 core 文件名生成规定:通过执行命令echo 1 > /proc/sys/kernel/core_uses_pid,能够将生成 core 文件的文件名改为 core.pid。默认状况下,core dump 生成的文件名为 core,文件生成在程序当前目录下。且新的 core 会笼罩已存在的 core。
  • 批改生成门路和文件名:通过批改 /proc/sys/kernel/core_pattern 能够管制 core 文件保留地位和文件格式。例如,通过命令 echo “/tmp/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern 将 core 文件保留在 /tmp/corefile/ 目录下,文件名的格局为 core- 命令名 -pid- 工夫戳.
  • core_pattern 的命名参数如下:

    %e dump 的命令名
    %p dump 的过程 PID
    %t dump 工夫戳(由 1970 年 1 月 1 日起计的秒数)
    %s 导致本次 core dump 的信号
    %c 转储文件的大小下限
    %g dump 的过程的理论组 ID
    %u dump 过程的理论用户 ID
    %h 主机名

产生 core 文件的必备条件

  • 环境变量的设置:通过后面介绍的 ulimit –c 等环境变量的设置关上 core 文件的生成限度。
  • 程序编译选项的设置:要产生 core 文件,编译器必须反对把以后过程的镜像以某种格局 dump 到一个文件中,常见的比方 gcc/g++ 的 -g 选项。
  • 解体时的非凡信号:Linux 内核会依据过程退出时的信号的类型来决定是否要产生 core 文件。例如 SIGSEGV、SIGABRT 等信号会产生 core,而 SIGALRM、SIGPIPE 等信号不会产生 core。

GDB 调试 core 文件

当程序 core dump 之后,应用命令 gdb program core 来查看 core 文件,其中 program 为可执行程序名,core 为生成的 core 文件名。而后执行 bt(backtrace)命令查看函数的调用堆栈,定位解体产生的地位。其余 gdb 调试技巧在此不赘述。

core 文件的毛病

  • 因为 core 文件是对过后过程地址空间的镜像,所以 core 文件大小个别都会比拟大,这样很占用磁盘空间,而且如果要将文件从服务器上下载到本地剖析也会比拟耗时。
  • 对于缓冲区溢出导致的 coredump,过程的调用堆栈曾经被笼罩毁坏了,core 文件显示的堆栈信息往往谬误。
  • 程序因 SIGALRM、SIGPIPE 等信号解体,则不会产生 core 文件。
退出移动版