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"
字符串常量是不可改变的,放在文字常量区,也就是静态存储区。
总结:
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这个字符串
举一个例子: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这个字符串将会永远不被引用,但是它会存在于整个程序的生命期.这才是真正的字符串常量.
比如const char *p= "hello ";这个字符串是存放在静态存储区上的,是不可以更改的.它的有效范围是整个程序的生命期.如果有另外的语句p= "nb ";那么,hello这个字符串将会永远不被引用,但是它会存在于整个程序的生命期.这才是真正的字符串常量.
3、Linux命令 ulimit :
『限制使用者的某些系统资源』的,包括可以开启的档案数量, 可以使用的 CPU 时间,可以使用的
内存总量等等。
-c :可建立的最大核心档案容量 (core files)
-c :可建立的最大核心档案容量 (core fi -c :可建立的最大核心档案容量 (core files)
-c :可建立的最大核心档案容量 (core fi -c :可建立的最大核心档案容量 (core files)
les)