`

Core dump

阅读更多
在c语言编程时,core文件可以帮助我们查找内存原因引起的程序故障。
我们先看看如下英文并翻译:
引用
In computing, a core dump consists of the recorded state of the working memory of a computer program at a specific time, generally when the program has terminated abnormally (crashed).[1] In practice, other key pieces of program state are usually dumped at the same time, including the processor registers, which may include the program counter and stack pointer, memory management information, and other processor and operating system flags and information. The name comes from the once-standard core memory technology. Core dumps are often used to diagnose or debug errors in computer programs.

On many operating systems, a fatal error in a program automatically triggers a core dump, and by extension the phrase "to dump core" has come to mean, in many cases, any fatal error, regardless of whether a record of the program memory results.

The term "core dump" has become jargon to indicate any deposition of a large amount of unedited data for further examination.

翻译:在(程序的)运行中,一个“内核转储”包含了计算机程序的内存运行在一个明确的时间的状态记录,通常在程序非正常中止的时候(坠毁)。实际上,程序状态的其它关键件经常同时产生转储,包括处理器的寄存器,寄存器还可能包括程序计数器(PC)和堆栈指针(SP),内存管理信息,和其它处理器和操作系统标志位和信息。它的名字来自一旦标准的核心存储技术。内核转存经常用于诊断或者调试计算机程序当中的错误。
在很多操作系统中,一个程序中的一个致命错误自动地出发一个内核转储,并且扩展地词组"to dump core"已经意味着在很多情况下,任意致命错误,无论是否是一个程序内存结果记录。
术语"core dump"已经成为用来指示任意大量未编辑的数据的沉积以用于将来检查的行业术语。
——翻译得非常不好,希望专业人士给予指正!谢谢!


转载一段较好的描述:http://blog.sina.com.cn/s/blog_621ae12b0100ekgz.html
core dump,翻译过来讲,就是核心转储。大致上就是指,如果由于应用错误,如浮点异常、指令异常等,操作系统将会转入内核的异常处理,向对应的进程发送特定的信号(SIGNAL),如果进程中没有对这些信号进行处理,就会转入默认的处理,core dump就是其中的一种。如果进程core dump,系统将会终止该进程,同时系统会产生core文件,以供调试使用。这个core文件其实就是内存的映像,即进程执行的时候内存的内容,也就是所谓的core dump。平常大家说某某进程core dump了,其实主要的意思就是说:某某进程因为错误而被系统自动终止了。

我当前使用的linux是Ubuntu9.04,gdb是6.8,gcc是4.3.3:
引用
canlynet@canlynet-desktop:~$ uname -a
Linux canlynet-desktop 2.6.28-11-generic #42-Ubuntu SMP Fri Apr 17 01:57:59 UTC 2009 i686 GNU/Linux

canlynet@canlynet-desktop:~$ gdb --version
GNU gdb 6.8-debian
Copyright (C) 2008 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 "i486-linux-gnu".

canlynet@canlynet-desktop:~$ gcc --version
gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3
Copyright © 2008 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权gpl.2


查看core file size的默认值(未修改过)man ulimit: ulimit - get and set user limits,关于ulimit请参考:http://www.ibm.com/developerworks/cn/linux/l-cn-ulimit/

引用

canlynet@canlynet-desktop:~$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


其中core file size表示生成core文件最大的大小,注意单位是blocks,-c参数用于设置。

我们写如下代码实验:
#include <stdio.h>

int main(int argc, char *argv[])
{
	int *p;

	*p = 21;
	printf("*p = %d", *p);

	return 0;
}


引用
canlynet@canlynet-desktop:~$ gcc -o test_core test_core.c -g
canlynet@canlynet-desktop:~$ ./test_core
段错误
canlynet@canlynet-desktop:~$ ls core*
ls: 无法访问 core*: 没有该文件或目录


我们看到,core file size为0的时候是不会生成core文件的。
我们设置一下:
引用

canlynet@canlynet-desktop:~$ ulimit -c 1024
canlynet@canlynet-desktop:~$ ulimit -a
core file size          (blocks, -c) 1024
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
canlynet@canlynet-desktop:~$ ./test_core
段错误 (core dumped)
canlynet@canlynet-desktop:~$ ls -l core*
-rw------- 1 canlynet canlynet 147456 2010-03-12 22:14 core



设置过core file size后,运行出错会产生core dumped。我们看到一个core文件。
我们用GDB调试工具来查看这个core。
引用

canlynet@canlynet-desktop:~$ gdb --core=core
GNU gdb 6.8-debian
Copyright (C) 2008 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 "i486-linux-gnu".
(no debugging symbols found)
Core was generated by `./test_core'.
Program terminated with signal 11, Segmentation fault.
[New process 8970]
#0  0x080483d8 in ?? ()
(gdb)

[New process 8970]中的8970是本次运行该程序产生进程的PID。

我们在gdb中运行bt(backtrace)命令:
引用

(gdb) bt
#0  0x080483d8 in ?? ()
#1  0xb7e29775 in ?? ()
#2  0x08048331 in ?? ()



此时看不到出错具体在代码的哪一行,我们再将文件信息传递给gdb:

引用

(gdb) file ./test_core
Reading symbols from /home/canlynet/test_core...done.
(gdb) bt
#0  0x080483d8 in main () at test_core.c:7
(gdb) l
1 #include <stdio.h>
2
3 int main(int argc, char *argv[])
4 {
5 int *p;
6
7 *p = 21;
8 printf("*p = %d", *p);
9
10 return 0;
(gdb)


这次我们就能查找出出错位置具体在main函数中第7行代码处了。

——备注:程序错误是c里野指针的典型解释。

——另外,对于段错误,我们不分析core文件也可以查错误产生的位置(gdb中run就可以了):
引用

(gdb) r
Starting program: /home/canlynet/test_core

Program received signal SIGSEGV, Segmentation fault.
0x080483d8 in main () at test_core.c:7
7 *p = 21;
(gdb) l
2
3 int main(int argc, char *argv[])
4 {
5 int *p;
6
7 *p = 21;
8 printf("*p = %d", *p);
9
10 return 0;
11 }
(gdb)

0
0
分享到:
评论

相关推荐

    window COREdump文件生成 c++代码

    在Windows操作系统上,生成Coredump文件对于调试和分析C++程序崩溃原因至关重要。Coredump文件包含了程序崩溃时内存中的关键信息,如进程的内存映射、全局变量、堆栈信息等,使得开发者能够定位到问题的具体位置,...

    Linux下生成core dump

    ### Linux下生成Core Dump详解 #### 一、Core Dump简介 在Linux环境下,当一个程序因为某种原因(如段错误)而崩溃时,系统可以自动为该程序创建一个名为“core dump”的文件。这个文件包含了程序崩溃时内存的快照...

    linux coredump分析方法实例介绍

    Linux Core Dump 分析方法实例介绍 本文将通过实例来介绍 Linux 中如何进行 Core Dump 分析,解决死机问题。 一、Core Dump 介绍 Core Dump 是 Linux 系统中一种特殊的文件,它记录了系统崩溃或死机时的系统状态...

    高通core dump解析工具

    在IT行业中,Core Dump是一种非常重要的调试手段,它记录了程序在崩溃时内存的状态,包括进程的寄存器信息、堆栈轨迹以及内存映射等。对于开发者来说,利用Core Dump进行问题排查能够帮助我们快速定位和修复软件中的...

    coredump文件的生成与解析.docx

    coredump 文件的生成与解析 coredump 文件是 Linux 操作系统中的一个重要概念,它记录了程序崩溃时的内存状态和寄存器信息,为程序崩溃后的调试和分析提供了重要的依据。本文将详细介绍 coredump 文件的生成和解析...

    Coredump简介及使用

    标题《Coredump简介及使用》和描述《Android Coredump简介及使用_v1.0_***.pdf》揭示了文档主要介绍Coredump的基本概念、产生的原因、控制产生Coredump的方法以及如何使用Coredump文件。Coredump机制广泛存在于多个...

    GDB之在线调试与Coredump分析

    在线调试是在程序运行的过程中进行调试,而Coredump分析是在程序异常退出后,通过分析Coredump文件了解程序崩溃时的状态,以确定崩溃的原因。 在线调试是开发者在程序运行时进行调试的过程,可以实时查看程序的运行...

    ubuntu-linux下程序崩溃生成coredump的方法.pdf

    ### Ubuntu Linux 下程序崩溃生成 Core Dump 的方法 #### 一、Linux 下 Core Dump 文件 **Core Dump 文件** 是一种在程序崩溃时由操作系统自动生成的文件,它包含了程序崩溃时刻的内存快照以及相关的系统信息。这...

    coredump问题原理探究-Linux x86版.rar

    在Linux系统中,当应用程序因某种异常而崩溃时,系统可能会生成一个名为"core dump"的文件,这个文件记录了程序崩溃时的内存状态、进程信息以及调用堆栈等重要数据,对于开发者来说,是排查问题的重要工具。...

    coredump文件调试

    Core Dump 文件调试 Core Dump 文件调试是指使用 GDB 调试 Core Dump 文件的过程。Core Dump 文件是操作系统执行的一个动作,当某个进程因为一些原因意外终止(crash)的时候,操作系统会将这个进程当时的内存信息...

    Accelerated Linux Core Dump Analysis

    Linux Core Dump 权威书籍

    容器中生成coredump文件

    如何在让docker中运行的进程生成core dump文件

    Linux Debugging(五): coredump 分析入門1

    在Linux系统中,调试是解决程序异常和错误的关键步骤,特别是在遇到程序崩溃并产生coredump时。coredump是操作系统在程序异常终止时保存的内存映像,包含了程序运行时的状态,如内存布局、堆栈信息、全局变量和...

    Linux Debugging: coredump 分析入门的材料

    本篇文章将围绕`coredump`分析进行入门讲解,结合实例深入探讨如何利用`coredump`来解决实际问题。 首先,我们要理解什么是`coredump`。当一个运行在Linux上的应用程序因为某种原因异常终止(如段错误、除零错误等...

    coredump栈分析

    在IT领域,`coredump`(核心转储)是一种记录程序崩溃时内存状态的文件,它包含了进程在异常发生时的内存映像、寄存器值以及调用堆栈等关键信息。`栈分析`是coredump分析的重要部分,通过分析栈信息,我们可以定位到...

    AIX 下的 core dump 分析入门

    AIX 下的 core dump 分析入门.mht,html文档,请大家参考以下

    Linux应用程序调试之debug_coredump

    在Linux系统中,当应用程序遇到不可恢复的错误时,如段错误(Segmentation fault),系统会生成一个核心转储文件(core dump)。这个文件包含了进程崩溃时刻的内存映像、寄存器状态以及堆栈信息,是分析和调试程序...

    劫持Linux系统调用封杀Core Dump漏洞攻击.pdf

    Linux 系统调用 Core Dump 漏洞攻击防御策略 Linux 操作系统是当今最流行的操作系统之一,然而,Linux 系统调用 Core Dump 漏洞攻击的出现却给系统安全带来了巨大的威胁。 Core Dump 漏洞是 Linux 内核 2.6.15-...

    SegmentFault(coredump)调试方法.pdf

    【SegmentFault(coredump)调试方法】 在编程和软件开发过程中,遇到程序崩溃或SegmentFault是一种常见的问题。这时,利用core dump进行调试可以帮助开发者找出问题的根源。core dump是操作系统在程序异常终止时生成...

Global site tag (gtag.js) - Google Analytics