core dump

Posted Li-Yongjun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了core dump相关的知识,希望对你有一定的参考价值。

前言

段错误(核心已转储)!!!

# ./test.out 
Segmentation fault (core dumped)
$ ./core.out 
段错误 (核心已转储)

运行一个程序,不小心发生了 段错误(核心已转储),多悲催啊😆。幸好我们有 core dump,能够帮助调试程序崩溃问题。今天我们就来聊一聊 core dump

概述

core dump 一词来源于 magnetic-core memory,这是上世纪六七十年代主流的内存介质。core 指记忆体也就是现在的内存。
操作系统在进程收到某个信号而终止运行时,将此时进程地址空间的内容以及进程相关状态信息写入一个磁盘文件,这个过程就叫 core dump,产生的文件就叫 core 文件。
core dump 记录了程序崩溃时的案发现场。我们可以使用 gdb 对 core 文件进行分析,叫做现场还原,就能够看到程序是因何而崩溃。

前提条件

a) 需要事先开启 core dump 功能,使用如下命令

ulimit -c 1024

b) gcc 编译程序需要加上 -g 选项以增加调试信息。

测试环境

BananaPi M1(在 ubuntu 上始终无法生成 core 文件,知道方法的同学可以留言)

测试程序

test.c

#include <stdio.h>

int main(int argc, char argv) 

	int *p = NULL;

	*p = 0; 	// 给空指针指向的地址赋值,引发core dump

	return 0;


编译

$ /home/liyongjun/project/board/buildroot/BPi-M1/host/bin/arm-buildroot-linux-uclibcgnueabihf-gcc -g test.c -o test.out

core dump

在 BananaPi M1 上运行

# ./test.out 
Segmentation fault
# ulimit -c 1024
# ./test.out 
Segmentation fault (core dumped)
# ls
core   test.out

第一次运行,发现并没有出现 core dump,是因为没使能 core dump 功能,使用 ulimit -c 1024 使能后,就出现了 core dump,ls 能看到 core 文件。

gdb 分析

上传到 ubuntu 使用 gdb 分析

$ arm-linux-gnueabihf-gdb test.out core 
GNU gdb (Linaro_GDB-2017.08) 8.0.0.20170823-git
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-unknown-linux-gnu --target=arm-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test.out...done.
[New LWP 149]

warning: Could not load shared library symbols for 2 libraries, e.g. /lib/libc.so.0.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
Core was generated by `./test.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x004e15a0 in main (argc=1, argv=116 't') at test.c:7
7		*p = 0; 	// 给空指针指向的地址赋值,引发core dump
(gdb)

gdb 直接就定位到了崩溃点:第 7 行:*p = 0;

以上是关于core dump的主要内容,如果未能解决你的问题,请参考以下文章

关于Linux的core dump那些事

linux core dump 配置和用法

linux core dump 配置和用法

Segmentation fault(Core Dump)

Core dump文件和ECFS

什么是 core dump ? 以及 core dumped 的调试