coredump故障分析

coredump叫做核心转存。当程序在运行过程中发生异常,这时Linux系统会将程序出错时的内存内容存储在一个(core.进程号)的文件中,这个过程叫core dump
此功能默认关闭: 
开启命令: ulimit -c unlimited(可使用的资源无限制)  
关闭命令: ulimit -c 0  ;
-c选项:当某些进程发生错误时,系统可能将该进程在内存的信息写成文件,这种文件被称为内核文件。此为限制每个内核文件的最大容量。
coredump主要用来处理当Linux应用程序在运行中,出现Segment fauit---段错误时的情况。
会产生段错误的原因: 
1、数组访问越界、
2、访问空指针
int *ptr = null;
*ptr = 0;

3、栈溢出

4、修改只读内存
char *ptr = "123456";//常量字符串不可以再赋值。
ptr[0] = 0;

可以使用GDB查看core文件的内容,以定位引发core dump的原因。
格式: gdb [exec file] [core file]
进入gdb之后,可使用bt命令查看程序运行到哪里出错了?



注:
复习
1、UNIX环境高级编程中的coredump知识点

2、C语言中字符串常量
字符串常量是一对双引号括起来的字符序列。
例如下面的是合法的字符串常量:
"how do you do.","CHINA","a","$123.45"
存储:字符串中的字符依次存储在内存中一块连续的区域内,并且把空字符‘ \0’自动附加到字符串的尾部作为字符串的结束标志。故字符个数为n的字符串在内存中应占(n+1)个字节
字符串常量是不可改变的,放在文字常量区,也就是静态存储区。

总结:

1.字符串常量是不可改变的,放在文字常量区,也就是在静态存储区上。

2.除了char buffer[20]= "hello ";和strcpy(p, "hello ");这两个情况外,程序中出现的字符串都应该被视为字符串常量了. 

 如const char *p= "hello ";

**************************************************************************

简单地说,除了存在栈和堆上的字符串才不是字符串常量.其余的都是字符串常量. 
举一个例子:char buffer[20]= "hello ";这个字符串是用来初始化字符数组buffer的,存在栈上,不是一个字符串常量,可以用下标读写其值.又比如,char *p=malloc(...); 
strcpy(p, "hello ");这个 "hello "也不是一个字符串常量,因为是在堆上,也可以用指针p进行读写.至于在这两者的前面加上const修饰,虽然表明 "hello "是不允许更改的,但是对于字符串来说,不能说明是字符串常量.因为,const要修饰的不是明确说hello是不可写的,而是说p指向的这段内存区域是不可写的.修饰的对象是不同的,只是恰巧这段区域里存的是hello这个字符串
除了这两个情况以外,程序中出现的字符串都应该被视为字符串常量了. 
比如const char *p= "hello ";这个字符串是存放在静态存储区上的,是不可以更改的.它的有效范围是整个程序的生命期.如果有另外的语句p= "nb ";那么,hello这个字符串将会永远不被引用,但是它会存在于整个程序的生命期.这才是真正的字符串常量.

3、Linux命令  ulimit : 限制使用者的某些系统资源』的,包括可以开启的档案数量, 可以使用的 CPU 时间,可以使用的
内存总量等等。


-c :可建立的最大核心档案容量 (core files)
-c :可建立的最大核心档案容量 (core fi -c :可建立的最大核心档案容量 (core files)

les)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值