【linux】Linux中Core Dump分析
Date: 2018.7.18
1、参考:
https://blog.****.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调试如下: