什么是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 多线程程序使用了线程不安全的函数。

应该使用以下这些可重入的函数,尤其注意红色标示出来的函数,它们非常easy被用错:

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 多线程读写的数据未加锁保护。

对于会被多个线程同一时候訪问的全局数据,应该注意加锁保护,否则非常easy造成core dump



4 非法指针

  a) 使用空指针

  b) 任意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这样的结构或类型的数组,否则不要将它转换为这样的结构或类型 的指针,而应该将这段内存复制到一个这样的结构或类型中,再訪问这个结构或类型。这是由于假设这段内存的開始地址不是依照这样的结构或类型对齐的,那么訪问它 时就非常easy由于bus error而core dump.



5 堆栈溢出

不要使用大的局部变量(由于局部变量都分配在栈上),这样easy造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

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的编译见<调试工具之四gdbserve>)



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

1> 在/etc/profile中添�下面一行,这将同意生成coredump文件

ulimit -c unlimited



2> 在rc.local中添�下面一行,这将使程序崩溃时生成的coredump文件位于/tmp文件夹下:

echo /tmp/core.%e.%p > /proc/sys/kernel/core_pattern 



/tmp/也能够是其他的文件夹位置。最佳位置应当满足下面需求:

* 对全部用户可写

* 空间容量足够大

* 掉电后文件不丢失

linux下coredump的产生及调试方法的更多相关文章

  1. linux下如何产生core,调试core

    linux下如何产生core,调试core 摘自:http://blog.163.com/redhumor@126/blog/static/19554784201131791239753/ 在程序不寻 ...

  2. Linux 下操作GPIO(两种方法,驱动和mmap)(转载)

    目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...

  3. Linux下进程通信的八种方法

    Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...

  4. Linux 下操作gpio(两种方法,驱动和mmap)

    目前我所知道的在linux下操作GPIO有两种方法: 1.  编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...

  5. linux下java调用.so文件的方法1: JNI

    摘自http://blog.163.com/squall_smile/blog/static/6034984020129296931793/ https://my.oschina.net/simabe ...

  6. Linux下最快速共享目录的方法

    Linux下最快速共享目录的方法 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 搭建FTP,或者是搭建网络文件系统,这 ...

  7. linux下查询进程占用的内存方法总结

    linux下查询进程占用的内存方法总结,假设现在有一个「php-cgi」的进程 ,进程id为「25282」.现在想要查询该进程占用的内存大小.linux命令行下有很多的工具进行查看,现总结常见的几种方 ...

  8. linux下各安装包的安装方法

    <转>linux下各安装包的安装方法   一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root ...

  9. 在linux下sh批处理文件调用java的方法

    解密 java -classpath collection-impl-0.0.1.jar com.ai.toptea.collection.message.DESEncrypt 1EFE4663895 ...

随机推荐

  1. PowerShell入门(一):PowerShell能干什么?

    原文链接:http://www.cnblogs.com/ceachy/archive/2013/01/30/WhatCanPowerShellDo.html PowerShell能干什么呢?就像序言中 ...

  2. swift 创建tableView并实现协议

    // // ViewController2.swift // swift_helloword // // Created by Charlie on 15/7/13. // Copyright (c) ...

  3. C++静态库与动态库(简介)

    C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...

  4. Python核心编程笔记---- input 与raw_input

    1.raw_input:的返回值是一个string 对象. 2.input:相当于eval(raw_input()),计算出来是什么类型就是什么类型. ------------------------ ...

  5. Oracle中强行断开用户连接的方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 首先查找目标用户的当前进程,注意是serial#而不是serial,网上有的介绍漏掉了#: select sid,serial# from v$s ...

  6. J2SE知识点摘记(二十六)

    为了用“集合框架”的额外部分把排序支持添加到 Java 2 SDK,版本 1.2,核心 Java 库作了许多更改.像 String 和 Integer 类如今实现 Comparable 接口以提供自然 ...

  7. Oracle EBS-SQL (SYS-23):用户权限查询.sql

    select b.user_name, b.description, b.creation_date, d.responsibility_name   from fnd_user b, fnd_use ...

  8. 使用Ramdisk 加速 Visualstudio 编译调试

    一般来说ASP.NET在执行的时候,会先动态编译在目录 C:\Windows\Microsoft.NET\Framework64\版本\Temporary ASP.NET Files 由于每次修改程序 ...

  9. Win7下qt5.3.1+opencv2.4.9编译环境的搭建(好多 Opencv2.4.9源码分析的博客)

      到官网下载qt-opensource-windows-x86-mingw482_opengl-5.3.1.exe文件,执行该文件,选择默认安装即可实现QT的安装(安装在C盘的根目录下),该文件封装 ...

  10. powerdesigner for sqlserver的一些实用配置

    在实用powerdesigner生成sqlserver 数据表时常常遇到一些问题: 1.数据中定义的字段名称相同生成物理模型时会报错. 2.数据各表之间的主键不能定义一样的名称. 我现在的需求是将数据 ...