core dump
首先解释什么是core dump。web
当一个进程要异常终止时,能够选择把进程的用户空间内存数据所有保存到磁盘上,文件名一般是core,这叫作core dump-核心转储。进程异常终止时由于有BUG,好比非法访问内存致使段错误。过后能够用调试器检查core文件以查清错误缘由,这叫作过后调试。
一个进程容许产生多大的core文件,取决于进程的Resource Limit。默认是不容许产生core文件的。在开发调试阶段能够用ulimit命令改变这个限制,容许产生core文件。数组
基于以上,总结了几点:
1.核心转储只能用于开发调试阶段
若是在程序容许期间或者是项目上线后,仍然能够核心转储,会带来许多问题,因为core dump是将用户数据所有写入硬盘,可能一次错误产生的数据就会将硬盘写满。其次,上线了的项目若是可以把全部数据经过core dump写入硬盘,显然这是不安全的 ,尤为是在包含密码等敏感信息时。因此core dump只能在开发调试阶段使用。安全
2.核心转储默认是不被开启的
一样,基于以上缘由,核心转储是默认不被开启的。如何开启调试后面会说。bash
3.形成core dump的缘由多线程
内存访问越界
a) 因为使用错误的下标,致使数组访问越界。
b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,可是字符串没有正常的使用结束符。
c) 使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操做函数,将目标字符串读/写爆。
多线程程序使用了线程不安全的函数。
多线程读写的数据未加锁保护。
对于会被多个线程同时访问的全局数据,应该注意加锁保护,不然很容易形成coredump
非法指针
a) 使用空指针
b) 随意使用指针转换。一个指向一段内存的指针,除非肯定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,不然不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是由于若是这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易由于bus error而core dump。
堆栈溢出
不要使用大的局部变量(由于局部变量都分配在栈上),这样容易形成堆栈溢出,破坏系统的栈和堆结构,致使出现莫名其妙的错误。
4.core dump如何定位svg
一般状况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各类函数调用堆栈信息等,咱们能够理解为是程序工做当前状态 存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,经过工具分析这个文件,咱们能够定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。函数
举个例子说明:
首先用一个会产生段错误的例子:工具
#include
int main()
{
int *p;
*p=100;
return 0;
}
首先编译运行看看会出现什么。
能够看到编译经过没问题,运行发现产生了段错误,core dump错误。
接下来,更改core文件大小。
用ulimit -a命令查看内存大小。spa
ulimit -a
能够看到core文件默认大小是0.
更改core文件大小用:线程
ulimit -c 1024
将core文件更改成1024。就能够产生core文件了。
再次查看,发现已经被更改了。
再次编译,经过编译。而后运行,仍然是段错误。可是此时发如今该路径下产生了一个core文件。
Linux下用gdb调试器用来调试。用gdb调试该程序,要加上core文件就能定位出段错误的位置。
能够看到,调试器已经帮咱们将错误定位出来了,而且将缘由及行号显示出来了。