linux强制core dump,Linux-core dump详解

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错误。

7559420f3e5715456bab0a787b58965f.png

接下来,更改core文件大小。

用ulimit -a命令查看内存大小。spa

ulimit -a

能够看到core文件默认大小是0.

3faa0c35985ec0457b4a48c97118b2dc.png

更改core文件大小用:线程

ulimit -c 1024

将core文件更改成1024。就能够产生core文件了。

再次查看,发现已经被更改了。

7074fe2f124f3975dc14921f0606cac1.png

再次编译,经过编译。而后运行,仍然是段错误。可是此时发如今该路径下产生了一个core文件。

e007eda57bebc43864792aec246b774c.png

Linux下用gdb调试器用来调试。用gdb调试该程序,要加上core文件就能定位出段错误的位置。

7179e6dce2ddadc4bac10ccd7c323abc.png

能够看到,调试器已经帮咱们将错误定位出来了,而且将缘由及行号显示出来了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值