• core dump


    什么是 core dump

    当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump

    为什么会有 core dump

    我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。

    linux信号机制与core

    上面说当程序运行过程中异常终止或崩溃时会发生 core dump,但还没说到什么具体的情景程序会发生异常终止或崩溃,例如我们使用 kill -9 命令杀死一个进程会发生 core dump 吗?实验证明是不能的,那么什么情况会产生呢?

    linux信号中每种信号都有其对应的操作,信号所对应的操作详见 linux信号,大致的操作种类如图:

    Term   Default action is to terminate the process.
    
    Ign    Default action is to ignore the signal.
    
    Core   Default action is to terminate the process and dump core (see core(5)).  //某些信号产生core
    
    Stop   Default action is to stop the process.
    
    Cont   Default action is to continue the process if it is currently stopped.

    以下列出几种信号,它们在发生时会产生 core dump:

    Signal	Action	Comment
    SIGQUIT	Core	Quit from keyboard
    SIGILL	Core	Illegal Instruction
    SIGABRT	Core	Abort signal from abort
    SIGSEGV	Core	Invalid memory reference
    SIGTRAP	Core	Trace/breakpoint trap

    当然不仅限于上面的几种信号。这就是为什么我们使用 Ctrl+z 来挂起一个进程或者 Ctrl+C 结束一个进程均不会产生 core dump,因为前者会向进程发出 SIGTSTP 信号,该信号的默认操作为暂停进程(Stop Process);后者会向进程发出SIGINT 信号,该信号默认操作为终止进程(Terminate Process)。同样上面提到的 kill -9 命令会发出 SIGKILL 命令,该命令默认为终止进程。而如果我们使用 Ctrl+ 来终止一个进程,会向进程发出 SIGQUIT 信号,默认是会产生 core dump 的。还有其它情景会产生 core dump, 如:程序调用 abort() 函数、访存错误、非法指令等等。

    利用信号产生core

    • 首先,要允许产生core,其次,产生core的位置

      • 在终端中输入命令 ulimit -c ,输出的结果为 0,说明默认是关闭 core dump 的,即当程序异常终止时,也不会生成 core dump 文件。
      • 我们可以使用命令 ulimit -c unlimited 来开启 core dump 功能,并且不限制 core dump 文件的大小; 如果需要限制文件的大小,将 unlimited 改成你想生成 core 文件最大的大小,注意单位为 blocks(KB)。
      • 用上面命令只会对当前的终端环境有效,如果想需要永久生效,可以修改文件 /etc/security/limits.conf文件
      # /etc/security/limits.conf
      #
      #Each line describes a limit for a user in the form:
      #
      #<domain>   <type>   <item>   <value>
        *          soft     core   unlimited

      通过修改 /proc/sys/kernel/core_uses_pid 文件可以让生成 core 文件名是否自动加上 pid 号。 例如 echo 1 > /proc/sys/kernel/core_uses_pid ,生成的 core 文件名将会变成 core.pid,其中 pid 表示该进程的 PID。 还可以通过修改 /proc/sys/kernel/core_pattern 来控制生成 core 文件保存的位置以及文件名格式。 例如可以用 echo "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern 设置生成的 core 文件保存在 “/tmp/corefile” 目录下,文件名格式为 “core-命令名-pid-时间戳”

    [root@VM_42_60_centos ~]# sleep 10
    ^Quit (core dumped)    # Ctrl+ core file at /tmp/
    [root@VM_42_60_centos ~]#

    GDB调试core文件

    • 首先,使用 gcc 编译源文件,加上 -g 以增加调试信息
    • 按照上面打开 core dump 的 ulimit设置 以使程序异常终止时能生成 core 文件
    • 运行程序,当core dump 之后,使用命令 gdb program core 来查看 core 文件,其中 program 为可执行程序名,core 为生成的 core 文件名
    #include <stdio.h>
    int func(int *p)
    {
        int y = *p;
        return y;
    }
    int main()
    {
        int *p = NULL;
        return func(p);
    }
    gcc core_demo.c -o core_demo -g
    gdb core_demo core_demo.core.24816

    之后就是如何使用GDB的问题了 [TODOLIST]

  • 相关阅读:
    Python修饰符实践
    回文
    Linux下安装Qt
    Linux下安装PyQT
    Python闭包实践
    杂乱
    windows下脚本转到linux下,文件保存格式要转换
    lua table.sort的bug
    shell截取某段
    coredump
  • 原文地址:https://www.cnblogs.com/how-are-you/p/7582577.html
Copyright © 2020-2023  润新知