Linux下发生段错误时如何产生core文件
Linux下的C程序常常会因为内存访问错误等原因造成segment fault(段错误),此时如果系统core
dump功能是打开的,那么将会有内存映像转储到硬盘上来,之后可以用gdb对core文件进行分析,还原系统发生段错误时刻的堆栈情况。这对于我们发现
程序bug很有帮助。
使用ulimit -a可以查看系统core文件的大小限制;使用ulimit -c
[kbytes]可以设置系统允许生成的core文件大小,例如
ulimit -c 0 不产生core文件
ulimit -c 100 设置core文件最大为100k
ulimit -c unlimited 不限制core文件大小
先看一段会造成段错误的程序:
#include <stdio.h>
int
main(
)
{
char
*
ptr=
"linuxers.cn"
;
*
ptr=
0
;
}
编译运行后结果如下:
[
leconte@
localhost test
]
$ gcc
-g
-o
test
a.c
[
leconte@
localhost test
]
$ ./
test
段错误
此时并没有产生core文件,接下来使用ulimit -c设置core文件大小为无限制,再执行./test程序,结果如下:
[
leconte@
localhost ~]
$ ulimit
-a
core file
size
(
blocks, -c)
0
.........
[
leconte@
localhost test
]
$ ulimit
-c
unlimited
[
leconte@
localhost test
]
$ ulimit
-a
core file
size
(
blocks, -c)
unlimited
..............
[
leconte@
localhost test
]
$ ./
test
段错误 (
core dumped)
[
leconte@
localhost test
]
$ ls
-al
core.*
-rw-------
1
leconte leconte 139264
01-06 22
:31
core.2065
可见core文件已经生成,接下来可以用gdb分析,查看堆栈情况:
[
leconte@
localhost test
]
$ gdb
./
test
core.2065
GNU gdb
Fedora (
6.8
-27.el5)
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
"i386-redhat-linux-gnu"
...
warning: exec
file
is newer than core file.
warning: Can't read pathname for load map: Input/output error.
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./test'
.
Program terminated with signal 11
, Segmentation fault.
[
New process 2065
]
#0 0x0804836f in main () at a.c:6
6
*
ptr
=0
;
从上述输出可以清楚的看到,段错误出现在a.c的第6行,问题已经清晰地定位到了。
很多系统默认的core文件大小都是0,我们可以通过在shell的启动脚本/etc/bashrc或者~/.bashrc等地方来加入
ulimit -c 命令来指定core文件大小,从而确保core文件能够生成。
除此之外,还可以在/proc/sys/kernel/core_pattern里设置core文件的文件名模板,详情请看core的官方man手册
。
注:本文转载于:http://www.linuxers.cn/2010/01/19/linux%E4%B8%8B%E5%8F%91%E7%94%9F%E6%AE%B5%E9%94%99%E8%AF%AF%E6%97%B6%E5%A6%82%E4%BD%95%E4%BA%A7%E7%94%9Fcore%E6%96%87%E4%BB%B6/
分享到:
相关推荐
### Linux下的段错误产生的原因及调试方法 #### 概述 段错误,即`Segmentation fault`,是在程序运行过程中由于非法访问内存所引发的一种错误。这种错误在Linux环境下非常常见,尤其对于使用C/C++这类需要手动管理...
"Linux下的段错误Segmentationfault产生的原因及调试方法经典" 在 Linux 系统中,段错误(Segmentation fault)是一种常见的错误,它是指访问了错误的内存段,或者访问了没有权限的内存区域,或者根本不存在对应的...
通过gdb或其他工具分析core dump,可以详细地了解段错误发生时的内存布局和变量状态。 4. 使用valgrind: Valgrind是一个用于内存调试、内存泄漏检测和性能分析的工具,它可以发现诸如段错误、未初始化的内存访问、...
要实现段错误的定位,我们首先需要编写一个信号处理器,用于记录错误发生时的堆栈信息。在C语言中,可以使用`signal()`函数来注册信号处理器,例如: ```c #include void segfault_handler(int signum) { // 在...
### Linux下的段错误产生的原因及调试方法 #### 一、段错误的概念与产生原因 **段错误**(Segmentation Fault)是一种常见的程序错误,当一个程序试图访问非法内存区域时,操作系统为了保护内存的安全性,会中断该...
在Linux环境下,当一个程序因为某种原因(如段错误)而崩溃时,系统可以自动为该程序创建一个名为“core dump”的文件。这个文件包含了程序崩溃时内存的快照,可用于后续分析问题的原因。在本文档中,我们将详细探讨...
在Linux中,当进程收到某些信号时,比如SIGABRT(调用abort函数时)、SIGQUIT(用户按下Ctrl-\时)、SIGSEGV(发生无效的内存访问,即段错误)等,系统可能会生成core文件。默认情况下,core文件的生成与否以及大小...
core文件是Linux下非常有用的调试工具之一,通过合理地设置core文件的生成与命名规则,并结合使用GDB和其他辅助工具,我们可以有效地定位程序中的错误,解决复杂的问题。此外,掌握core文件的高级调试技巧,如多线程...
总之,Linux中的core文件是调试程序的关键工具,尤其是在处理诸如段错误这样的运行时错误时。理解core文件的生成原理,学会使用`ulimit`和调试器,可以帮助开发者有效地诊断和修复程序中的问题。
Linux操作系统中,当进程因为遭遇错误而异常终止时,系统可以生成一个Core Dump文件,即核心转储文件。Core Dump文件包含进程终止时刻的内存映像,用于之后进行错误分析和调试。本文档将对Linux中的Core Dump文件...
### Linux下产生Core Dump文件及使用GDB调试详解 #### 一、Core文件的基本概念与作用 当一个程序因为某些原因而崩溃时,系统内核会自动创建一个名为`core`的文件,这个文件包含了程序崩溃时刻的内存映像以及其他...
在Linux环境中,当一个程序出现异常终止时,系统可以自动生成一个称为core dump的文件,这个文件包含了程序崩溃时的内存快照和其他相关信息,这对于调试和诊断程序错误非常有帮助。 #### 一、Core文件的作用与重要...
Core Dump 是 Linux 系统中一种特殊的文件,它记录了系统崩溃或死机时的系统状态信息。Core Dump 文件可以帮助开发者快速定位问题,解决系统崩溃的原因。 二、Core Dump 分析步骤 1. 抓取 trace:在系统崩溃后,...
本文将详细介绍如何在Linux环境下设置core文件生成,并且编写相应的代码,以便在程序出现段错误时能够获取内存的核心转储文件。 首先,需要了解的是core文件的生成开关以及大小限制。Linux系统默认情况下可能会关闭...
在Linux环境下,C++和Qt开发中,生成和调试Core文件是排查程序错误的重要手段。Core文件是由操作系统在程序异常终止时自动生成的一种二进制文件,它包含了程序崩溃时的内存映像、堆栈信息、寄存器状态等关键数据,对...
当一个程序由于某种原因(如段错误、除零错误等)崩溃时,系统默认可能会生成一个core文件。这个文件包含了程序崩溃时的内存快照,包括全局变量、堆栈信息、程序的动态内存分配情况等,用于后续的调试分析。 2. **...