[转]coredump简介与coredump原因总结

[转]coredump简介与coredump原因总结

http://blog.sina.com.cn/s/blog_54f82cc201013srb.html

什么是coredump?

通常情况下coredmp包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等。可以理解为把程序工作的当前状态存储成一个文件。许多程序和操作系统出错时会自动生成一个core文件。

如何使用coredump?

coredump可以用在很多场合,使用Linux,或者solaris的人可能都有过这种经历,系统在跑一些压力测试或者系统负载一大的话,系统就hang住了或者干脆system panic.这时唯一能帮助你分析和解决问题的就是coredump了。

现在很多应该程序出错时也会出现coredump.

分析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的原因很多,这里根据以往的经验总结一下:

1 内存访问越界
  a) 由于使用错误的下标,导致数组访问越界
  b)
搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符
  c) 使用strcpy, strcat, sprintf, strcmp,
strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat,
strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。
 
2 多线程程序使用了线程不安全的函数。
应该使用下面这些可重入的函数,尤其注意红色标示出来的函数,它们很容易被用错:
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)
随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型
的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它
时就很容易因为bus error而core dump.
 
5 堆栈溢出
不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

coredump文件的生成方法以及使用方法:

(假设下例是在x86上交叉编译,而在arm上运行异常的现象)

1. 
在arm内核里加入coredump的支持(一般内核都支持coredump, 不用重编)

2. 
运行命令,此时允许coredump文件产生:(在arm上)
 ulimit –c
unlimited

3. 
执行程序:(在arm上)
./test
在异常退出时,会显示如下信息,注意括号里的内容
Segmentation fault (core
dumped)
程序执行目录下将产生*core文件

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


系统支持生成core并设置存储位置的方法:

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

2>

时间: 2024-09-30 05:54:33

[转]coredump简介与coredump原因总结的相关文章

coredump简介与coredump原因总结

from:http://www.cnblogs.com/doctorqbw/archive/2011/12/21/2295962.html 千兵卫博士 coredump简介与coredump原因总结 什么是coredump? 通常情况下coredmp包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等.可以理解为把程序工作的当前状态存储成一个文件.许多程序和操作系统出错时会自动生成一个core文件. 如何使用coredump? coredump可以用在很多场合,使用Linux,或者sol

Coredump介绍及如何在Android中开启和使用来分析Crash等问题

文章目录: Coredump简介及使用... 1 目录... 2 一.什么是Coredump. 3 二.Coredump产生的原因... 3 三.如何控制产生Coredump. 4 四.使用Coredump的准备... 4 五.开始使用Coredump. 5 一.什么是Coredump 有些C/C++程序或者通过JNI调用了C/C++的APK程序可以通过编译, 但在运行时会出现错误,比如常见的signal 11 (SIGSEGV),这样的程序都是可以通过编译的,而且这样的错误一般情况下不会像编译

coredump功能介绍

[coredump简介] blog.csdn.net/tenfyguo/article/details/8159176 [如何打开coredump功能] 1.打开kernel编译开关 @kernel/arch/arm/Kconfig config ARM bool default y select HAVE_AOUT select HAVE_DMA_API_DEBUG ... + select ELF_CORE ... select HAVE_BPF_JIT if NET help ... 这个

嵌入式系统coredump设计

阴沟翻船,马失前蹄,说明凡事皆有可能.自然,程序设计的再好,也会有crash的时候.开发期还还说,正式交付的系统crash自然更是难以承受的.无论何时,死一次就够了,得有方法查个水落石出. 几年前哥去广州的一家民企呆过些日子.刚到那,就碰上系统毫无线索的crash.咋办?哥想静下心来,花点时间做个工具去定位,但无奈硬件出生的领导天天赶着大家守在机房.唉,无知啊,天天守在机房,面对crash,哥想到的只有我儿子常常念的诗--来如春梦不多时,去如朝霞无觅处.嗯,crash,哥只能数数又crash了几

程序故障分析coredump

一:使用coredump故障分析工具的原因: core文件:a core file or core dump is a file that records the memory iimage of a running process and               its process status  (register values etc ....) 当一个进程崩溃时,在该进程会在指定目录生成一个core文件 用来记录该进程崩溃时的内存映像,并附带了一些调试信息.该文件主要供   调试

coredump调试的使用

一,什么是coredump 跑程序的时候经常碰到SIGNAL 或者 call trace的问题,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件. 通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态 存储生成第一个文件,许多的程序出错的时候都会产生一个core文

Android——coredump 配置

撰写不易,转载需注明出处:http://blog.csdn.net/jscese/article/details/46699117本文来自 [jscese]的博客! kernel支持: 由linux支持,进程崩溃时记录存储堆栈空间,寄存器等相关内容,保留致命现场数据,便于分析查找根源. 编译项: Symbol: COREDUMP [=y] Type : boolean Prompt: Enable core dump support Location: (1) -> Userspace bina

转载:进程退出状态--waitpid status意义

最近遇到一个进程突然退出的问题,由于没有注册signalhandler所以没有捕捉到任何信号. 但是从log中看到init waitpid返回的status为0x008b,以前对status不是很了解,下面的文章对status有比较全面的介绍. 转至http://tsecer.blog.163.com/blog/static/15018172012323975152/ 一.和子进程同步在linux系统中,父进程通常需要通过waitpid来等待/获取子进程状态变化情况,而这个主要就是通过waitX

linux c: core dump

1. core dump文件系统设置 http://www.cnblogs.com/no7dw/archive/2013/02/18/2915819.html 编译时需要输入-g才会生成coredump文件: gcc -g -o test test.c core文件的生成开关和大小限制: 1)使用ulimit -c 命令可查看core文件的生成开关.若结果为0,则表示关闭了此功能,不会生成core文件. 2)使用ulimit -c filesize命令,可以限制core文件的大小 ulimit