coredump简要介绍与coredump原因计算

Linux开启coredump

什么是coredump?

mkdir -p /home/data/corefile
chmod 777 /home/data/corefile
echo “ulimit -S -c unlimited > /dev/null 2>&1” >>
/etc/profile
source /etc/profile
echo “1” > /proc/sys/kernel/core_uses_pid
echo “/home/data/corefile/core-%e-%p_%t” >
/proc/sys/kernel/core_pattern
echo “1” > /proc/sys/fs/suid_dumpable

万般状态下coredmp包罗了程序运营时的内部存款和储蓄器,寄存器状态,旅舍指针,内部存款和储蓄器处理音讯等。可以通晓为把程序办事的当前情景存款和储蓄成3个文本。大多顺序和操作系统出错开上下班时间会自动生成多少个core文件。

实行上述命令之后

什么样选拔coredump?

万一那台机器上随便三个先后core掉了,就能够在/home/data/corefile下发生1个core文件,方便复现难点

coredump能够用在重重场合,使用Linux,可能solaris的人大概都有过这种经历,系统在跑一些压力测试大概系统负荷一大的话,系统就hang住了大概干脆system
panic.那时唯壹能帮助您深入分析和缓慢解决问题的正是coredump了。

本文恒久更新链接地址http://www.linuxidc.com/Linux/2016-01/127903.htm

今天游人如织应有程序出错开上下班时间也会油然则生coredump.

图片 1

分析coredump的工具

未来一大半类unix操作系统都提供了深入分析core文件的工具,举例 GNU Binutils
Binary File Descriptor library (BFD), GNU Debugger (gdb),mdb等

coredump的文件格式

类unix操作系统中央银行使efi格式保存coredump文件。

在solairs下

bash-3.2# file *unix.3 ELF 32-bit LSB executable 80386 Version 1,
statically linked, not stripped, no debugging information
availableunix.4 ELF 32-bit LSB executable 80386 Version 1, statically
linked, not stripped, no debugging information available

造成程序coredump的原因诸多,这里依照过去的经验计算一下:

一 内部存款和储蓄器访问越界
  a) 由于应用不当的下标,导致数组访问越界
  b)
寻找字符串时,依附字符串结束符来决断字符串是不是结束,不过字符串未有正规的利用实现符
  c) 使用strcpy, strcat, sprintf, strcmp,
strcasecmp等字符串操作函数,将指标字符串读/写爆。应该使用strncpy,
strlcpy, strncat, strlcat, snprintf, strncmp,
strncasecmp等函数防止读写越界。
 
二 四线程程序行使了线程不安全的函数。
有道是采纳下边那些可重入的函数,特别令人瞩目暗紫标识出来的函数,它们很轻松被用错:
asctime_r(3c) gethostbyname_r(3n) getservbyname_r(3n) ctermid_r(3s)
gethostent_r(3n) getservbyport_r(3n) ctime_r(3c) getlogin_r(3c)
getservent_r(3n) fgetgrent_r(3c) getnetbyaddr_r(3n) getspent_r(3c)
fgetpwent_r(3c) getnetbyname_r(3n) getspnam_r(3c) fgetspent_r(3c)
getnetent_r(3n) gmtime_r(3c) gamma_r(3m) getnetgrent_r(3n)
lgamma_r(3m) getauclassent_r(3) getprotobyname_r(3n) localtime_r(3c)
getauclassnam_r(3) etprotobynumber_r(3n) nis_sperror_r(3n)
getauevent_r(3) getprotoent_r(3n) rand_r(3c) getauevnam_r(3)
getpwent_r(3c) readdir_r(3c) getauevnum_r(3) getpwnam_r(3c)
strtok_r(3c) getgrent_r(3c) getpwuid_r(3c) tmpnam_r(3s)
getgrgid_r(3c) getrpcbyname_r(3n) ttyname_r(3c) getgrnam_r(3c)
getrpcbynumber_r(3n) gethostbyaddr_r(3n) getrpcent_r(3n)
 
3 多线程读写的多少未加锁尊崇。
对此会被几个线程同期做客的大局数据,应该专注加锁敬服,不然很轻巧导致core
dump
 
4 违法指针
  a) 使用空指针
  b)
随便使用指针调换。一个对准一段内存的指针,除非显明这段内部存款和储蓄器原先就分配为某种结构或项目,或然这种结构或项指标数组,否则不要将它转变为这种组织或类型
的指针,而相应将这段内部存款和储蓄器拷贝到三个这种结构或项目中,再拜访那么些协会或项目。那是因为1旦这段内存的发端地址不是依照这种结构或项目对齐的,那么访问它
时就很轻便因为bus error而core dump.
 
5 货仓溢出
决不采纳大的片段变量(因为部分变量都分配在栈上),那样便于形成仓库溢出,破坏系统的栈和堆结构,导致出现无缘无故的荒唐。

 

coredump文件的生成方法以及利用形式:

(假如下例是在x8陆上交叉编写翻译,而在arm上运维十分的风貌)

1.  在arm内核里到场coredump的支持(一般内核都援助coredump, 不用重编)

二.  运维命令,此时允许coredump文件发出:(在arm上)
 ulimit –c unlimited

三.  实施顺序:(在arm上)
./test
在非常退出时,会来得如下音讯,注意括号里的开始和结果
Segmentation fault (core dumped)
程序施行目录下将发出*core文件

4.  用gdb分析:(在x86上)
arm-linux-gdb ./test test.core
再用gdb的bt或where看就足以了
(arm-linux-gdb的编写翻译见<调节和测试工具之四gdbserve>)


系统援助生成core并设置存款和储蓄地方的秘技:

一> 在/etc/profile中加入以下1行,这将允许生成coredump文件
ulimit -c unlimited

二>
在rc.local中参预以下壹行,那将使程序崩溃时生成的coredump文件位于/tmp目录下:
echo /tmp/core.%e.%p > /proc/sys/kernel/core_pattern 

/tmp/也足以是别的的目录地点。最佳地方应该满足以下须要:
* 对持有用户可写
* 空间体量丰富大
* 掉电后文件不丢掉

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图