Segment fault及LINUX core dump详解
源自:http://andyniu.iteye.com/blog/1965571
core dump的概念:
A core dump is the recorded state of the working memory of a computer program at a specific time, generally when the program has terminated abnormally (crashed). 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 memory technology core memory. 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 is created.
在Linux平台下,设置core dump文件生成的方法:
如何产生Core Dump
发生doredump一般都是在进程收到某个信号的时候,Linux上现在大概有60多个信号,可以使用 kill -l 命令全部列出来。
) SIGHUP ) SIGINT ) SIGQUIT ) SIGILL ) SIGTRAP
) SIGABRT ) SIGBUS ) SIGFPE ) SIGKILL ) SIGUSR1
) SIGSEGV ) SIGUSR2 ) SIGPIPE ) SIGALRM ) SIGTERM
) SIGSTKFLT ) SIGCHLD ) SIGCONT ) SIGSTOP ) SIGTSTP
) SIGTTIN ) SIGTTOU ) SIGURG ) SIGXCPU ) SIGXFSZ
) SIGVTALRM ) SIGPROF ) SIGWINCH ) SIGIO ) SIGPWR
) SIGSYS ) SIGRTMIN ) SIGRTMIN+362 ) SIGRTMIN+384 ) SIGRTMIN+406 ) SIGRTMIN+428
) SIGRTMIN+4410 ) SIGRTMIN+4612 ) SIGRTMIN+4814 ) SIGRTMIN+5014 ) SIGRTMAX-5212
) SIGRTMAX-5410 ) SIGRTMAX-568 ) SIGRTMAX-586 ) SIGRTMAX-604 ) SIGRTMAX-622
) SIGRTMAX-64
)SIGQUIT )SIGILL )SIGABRT )SIGFPE )SIGSEGV )SIGBUS )SIGSYS
)SIGTRAP )SIGXCPU )SIGXFSZ )SIGIOT
我们看到SIGSEGV在其中,一般数组越界或是访问空指针都会产生这个信号。另外虽然默认是这样的,但是你也可以写自己的信号处理函数改变默认行为,更多信号相关可以看参考链接33。
上述内容只是产生coredump的必要条件,而非充分条件。要产生core文件还依赖于程序运行的shell,可以通过ulimit -a命令查看,输出内容大致如下:
看到第一行了吧,core file size,这个值用来限制产生的core文件大小,超过这个值就不会保存了。我这里输出是0,也就是不会保存core文件,即使产生了,也保存不下来==! 要改变这个设置,可以使用ulimit -c unlimited。
OK, 现在万事具备,只缺一个能产生Core的程序了,介个对C程序员来说太容易了。
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(51,153,51); vertical-align:baseline; background-color:transparent">#include <stdlib.h>;</span>
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(153,51,51); vertical-align:baseline; background-color:transparent">int</span> crash<span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">(</span><span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">)</span>
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">{</span>
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(153,51,51); vertical-align:baseline; background-color:transparent">char</span> <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(51,153,51); vertical-align:baseline; background-color:transparent">*</span>xxx <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(51,153,51); vertical-align:baseline; background-color:transparent">=</span> <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(255,0,0); vertical-align:baseline; background-color:transparent">"crash!!"</span><span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(51,153,51); vertical-align:baseline; background-color:transparent">;</span>
- xxx<span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">[</span><span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,0,221); vertical-align:baseline; background-color:transparent">1</span><span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">]</span> <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(51,153,51); vertical-align:baseline; background-color:transparent">=</span> <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(255,0,0); vertical-align:baseline; background-color:transparent">'D'</span><span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(51,153,51); vertical-align:baseline; background-color:transparent">;</span> <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(102,102,102); font-style:italic; vertical-align:baseline; background-color:transparent">// 写只读存储区!</span>
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(177,177,0); vertical-align:baseline; background-color:transparent">return</span> <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,0,221); vertical-align:baseline; background-color:transparent">2</span><span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(51,153,51); vertical-align:baseline; background-color:transparent">;</span>
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">}</span>
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(153,51,51); vertical-align:baseline; background-color:transparent">int</span> foo<span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">(</span><span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">)</span>
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">{</span>
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(177,177,0); vertical-align:baseline; background-color:transparent">return</span> crash<span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">(</span><span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">)</span><span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(51,153,51); vertical-align:baseline; background-color:transparent">;</span>
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">}</span>
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(153,51,51); vertical-align:baseline; background-color:transparent">int</span> main<span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">(</span><span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">)</span>
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">{</span>
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(177,177,0); vertical-align:baseline; background-color:transparent">return</span> foo<span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">(</span><span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">)</span><span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(51,153,51); vertical-align:baseline; background-color:transparent">;</span>
- <span style="margin:0px; padding:0px; border:0px currentColor; color:rgb(0,153,0); vertical-align:baseline; background-color:transparent">}</span>
上手调试
|
2
4
6
8
10
12
|
#include <stdio.h>{*p = 0;
{func(NULL);
return
0;
} |
Segmentation fault (core dumped)
#0 0x080483ba in func ()
如何定位到行?
main /tmp/core-main-10815
#0 0x080483ba in func (p=0x0) at a.c:5
5 *p = 0;
-c unlimited
上边的程序编译的时候有一点需要注意,需要带上参数-g, 这样生成的可执行程序中会带上足够的调试信息。编译运行之后你就应该能看见期待已久的“Segment Fault(core dumped)”或是“段错误 (核心已转储)”之类的字眼了。看看当前目录下是不是有个core或是core.xxx的文件。祭出linux下经典的调试器GDB,首先带着core文件载入程序:gdb exefile core,这里需要注意的这个core文件必须是exefile产生的,否则符号表会对不上。载入之后大概是这个样子的:
(gdb)
我们看到已经能直接定位到出core的地方了,在第8行写了一个只读的内存区域导致触发Segment Fault信号。在载入core的时候有个小技巧,如果你事先不知道这个core文件是由哪个程序产生的,你可以先随便找个代替一下,比如/usr/bin/w就是不错的选择。比如我们采用这种方法载入上边产生的core,gdb会有类似的输出:
启动程序:run
- 打印堆栈信息:bt
Segment fault及LINUX core dump详解的更多相关文章
- Segment fault及LINUX core dump详解 (zz)
C 程序在进行中发生segment fault(core dump)错误,通常与内存操作不当有关,主要有以下几种情况: (1)数组越界. (2)修改了只读内存. (3)scanf("%d&q ...
- 【转】段错误调试神器 - Core Dump详解
from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...
- 段错误调试神器 - Core Dump详解
一.前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得 ...
- 造成segment fault,产生core dump的可能原因
1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符 c) 使用strcpy, strcat, spr ...
- 【转】 Linux Core Dump 介绍
=============================================================== Linux core dump的祥细介绍和使用 =========== ...
- linux core dump 文件 gdb分析
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIG ...
- Linux core dump file详解
Linux core dump file详解 http://www.cnblogs.com/langqi250/archive/2013/03/05/2944931.html
- 红帽Linux故障定位技术详解与实例(2)
红帽Linux故障定位技术详解与实例(2) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍 ...
- linux进程地址空间详解(转载)
linux进程地址空间详解(转载) 在前面的<对一个程序在内存中的分析 >中很好的描述了程序在内存中的布局,这里对这个结果做些总结和实验验证.下面以Linux为例(实验结果显示window ...
随机推荐
- JavaWeb学习记录(五)——Servlet随机产生验证码
随机产生验证码的工具类: import java.awt.Color;import java.awt.Graphics;import java.awt.image.BufferedImage;impo ...
- 回调函数的实现 & 结构体的继承
------------------------------------------------------------------------------------[1]------------- ...
- 《苹果开发之Cocoa编程》挑战2 创建一个数据源 练习
<苹果开发之Cocoa编程>第4版 P87 创建一个to-do list应用程序,在文本框中输入任务.当用户单击Add按钮时,添加字符串到一个变长队列,新任务就出现在list的末尾. 关键 ...
- 黑马程序员——JAVA基础之简述面向对象,类,变量,匿名对象
------- android培训.java培训.期待与您交流! ---------- 面向对象: 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将 ...
- apache日志切割
一.日志切割 安装cronolog CentOS 5.4中编译安装Apache默认日志是不切割的,需要用用工具Cronnolog进行日志切割 1.下载及安装 wget http://cronolog. ...
- mysql学习之-逻辑架构
mysql逻辑架构图: 第一层,服务层(为客户端服务):为请求做连接处理,授权认证,安全等. 1. 每个连接的查询都在一个进程中的线程完成. 2. 服务器负责缓存线程,所以服务层不需要为每个连接新 ...
- MySQL中行列转换的SQL技巧
行列转换常见场景 由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式.即同一个列中存储了多个属性值(具体结构见下表). 这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列 ...
- 使用latencytop深度了解你的系统的延迟(转)
转载自系统技术非业余研究 http://blog.yufeng.info/archives/1239 我们在系统调优或者定位问题的时候,经常会发现多线程程序的效率很低,但是又不知道问题出在哪里,就知道 ...
- 非root模式下安装mysql php小记
假设你的home目录为/home/work mysql-server 安装 1. 下载mysql.tar.gz wget http://dev.mysql.com/get/Downloads/MySQ ...
- Problem A+B(Big Integer)
/*======================================================================== Problem A+B(Big Integer) ...