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调试如下:

    这里写图片描述

  • 相关阅读:
    Linux下卸载openjdk,安装jdk
    dom4j移除节点不成功
    运费模版源码(.net)
    电子商城系统运费模板设计
    【转】js判断手机访问网页
    nopcommerce之一(结构分析)
    js阻止提交表单(post)
    s1=s1+1与s1+=1的区别
    .net中从GridView中导出数据到excel(详细)
    分布式事务中常见的三种解决方案
  • 原文地址:https://www.cnblogs.com/SoaringLee/p/10532415.html
Copyright © 2011-2022 走看看