zoukankan      html  css  js  c++  java
  • 【linux】Linux中Core Dump分析

    Date: 2018.7.18


    1、参考:

    https://blog.csdn.net/zp31415929/article/details/77528903?ref=myread
    https://www.cnblogs.com/lidabo/p/5014710.html
    http://hutaow.com/blog/2013/10/25/linux-core-dump/
    https://www.cnblogs.com/secondtonone1/p/5732938.html

    2、什么是Core Dump?

    Core Dump 又叫核心转储。在程序运行过程中发生异常时,将其内存数据保存到文件中,这个过程叫做 Core Dump。Core是指记忆体也就是现在的内存。

    3、Core Dump有什么用?

    在开发过程中,难免会遇到程序运行过程中异常退出的情况,这时候想要定位哪里出了问题,仅仅依靠程序自身的信息打印(日志记录)往往是不够的,这个时候就需要 Core Dump 文件来帮忙了。

    一个完整的 Core Dump 文件实际上相当于恢复了异常现场,利用 Core Dump 文件,可以查看到程序异常时的所有信息,变量值、栈信息、内存数据,程序异常时的运行位置(甚至记录代码行号)等等,定位所需要的一切信息都可以从 Core Dump文件获取到,能够非常有效的提高定位效率。

    Core Dump的生成往往是由于程序异常导致系统触发退出信号造成的。比如常见的段错误segmentation fault(core dumped)。

    4、怎么生成Core Dump?

    在Linux上,设置

    ulimit -c unlimited

    即可使能Core文件。实际上,通过设置core文件大小限制来是否使能Core文件。

    采用ulimit -a 命令可以查看相关属性。

    在Linux下要保证程序崩溃时生成 Coredump要注意这些问题: (仅供参考)

      一、要保证存放Coredump的目录存在且进程对该目录有写权限。存放Coredump 的目录即进程的当前目录,一般就是当初发出命令启动该进程时所在的目录。但如果是通过脚本启动,则脚本可能会修改当前目录,这时进程真正的当前目录就会与当初执行脚本所在目录不同。这时可以查看”/proc/进程pid>/cwd“符号链接的目标来确定进程真正的当前目录地址。通过系统服务启动的进程也可通过这一方法查看。

      二、若程序调用了seteuid()/setegid()改变了进程的有效用户或组,则在默认情况下系统不会为这些进程生成Coredump。很多服务程序都会调用seteuid(),如MySQL,不论你用什么用户运行 mysqld_safe启动MySQL,mysqld进行的有效用户始终是msyql用户。如果你当初是以用户A运行了某个程序,但在ps里看到的 这个程序的用户却是B的话,那么这些进程就是调用了seteuid了。为了能够让这些进程生成core dump,需要将/proc/sys/fs/suid_dumpable 文件的内容改为1(一般默认是0)。
      

    5、Core Dump文件生成在哪里?

    可以通过以下命令: cat /proc/sys/kernel/core-pattern 查看Core Dump文件的生成路径和格式。
    默认Core Dump文件为core,在一些linux版本下,生成的core文件带有进程号,比如core.7715。
    也可以设置为如下格式: core-%e-%p-%t
    其中%e表示程序名称,%p表示进程PID,%t表示触发Core Dump的时间(单位为秒,从 1970-01-01 00:00:00 开始计算)。

    6、如何使用Core Dump文件?

    可以采用Linux中的gdb进行调试分析Core Dump文件。

    gdb [exec file] [core file]

    加载完成后,即可以在GDB中查看程序异常时的各种运行信息了(查看变量值、线程信息、调用栈、反汇编等等)
    调试命令可以采用where或者bt(backtrace)查看程序崩溃时的堆栈信息。

    7、实例分析

    TEST_CORE.C

    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    void core_test1()
    {
        int i = 0;
        //below will call segmentfault
        scanf("%d", i);
        printf("%d", i);
    
    }
    
    
    int main()
    {
        core_test1();
        return 0;
    }

    编译生成可执行文件:gcc TEST_DUMP.c -o test_dump
    运行./test_dump
    测试结果为:
    这里写图片描述

    分析:

    生成core文件为:
    gdb ./test_dump core
    gdb调试如下:

    这里写图片描述

  • 相关阅读:
    BestCoder17 1001.Chessboard(hdu 5100) 解题报告
    codeforces 485A.Factory 解题报告
    codeforces 485B Valuable Resources 解题报告
    BestCoder16 1002.Revenge of LIS II(hdu 5087) 解题报告
    codeforces 374A Inna and Pink Pony 解题报告
    codeforces 483B Friends and Presents 解题报告
    BestCoder15 1002.Instruction(hdu 5083) 解题报告
    codeforces 483C.Diverse Permutation 解题报告
    codeforces 483A. Counterexample 解题报告
    NSArray中地内存管理 理解
  • 原文地址:https://www.cnblogs.com/SoaringLee/p/10532415.html
Copyright © 2011-2022 走看看