core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (Linux中如果内存越界会收到SIGSEGV信号,然后就会core dump)

在程序运行的过程中,有的时候我们会遇到Segment fault(段错误)这样的错误。这种看起来比较困难,因为没有任何的栈、trace信息输出。该种类型的错误往往与指针操作相关。往往可以通过这样的方式进行定位。

一 造成segment fault,产生core dump的可能原因

1.内存访问越界

a) 由于使用错误的下标,导致数组访问越界

b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符

c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

2 多线程程序使用了线程不安全的函数。

3 多线程读写的数据未加锁保护。对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump

4 非法指针

a) 使用空指针

b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump.

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

二 配置操作系统使其产生core文件

首先通过ulimit命令查看一下系统是否配置支持了dump core的功能。通过ulimit -c或ulimit -a,可以查看core file大小的配置情况,如果为0,则表示系统关闭了dump core。可以通过ulimit -c unlimited来打开。若发生了段错误,但没有core dump,是由于系统禁止core文件的生成。

解决方法:
$ulimit -c unlimited  (只对当前shell进程有效)
或在~/.bashrc 的最后加入: ulimit -c unlimited (一劳永逸)

# ulimit -c

0

$ ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

file size (blocks, -f) unlimited

三 用gdb查看core文件

core文件需要使用gdb来查看。
          gdb ./a.out
          core-file core.xxxx

gdb ./a.out  core.xxxx

四 样例

1. 空指针

样例:

#include <stdio.h>

int main(void)

{

printf("hello world! dump core for set value to NULL pointer/n");

*(char *)0 = 0;

return 0;

}

# gcc -g test.c -o test

# ./test

hello world! dump core for set value to NULL pointer

Segmentation fault

/× Get segmentation fault, but there is no core dump. The reason is that the system configure core file size to zero ×/

# ls

test test.c

/* Set core file size to unlimited */

# ulimit -c unlimited

# ./test

hello world! dump core for set value to NULL pointer

Segmentation fault (core dumped)

/* Get core dump after change core file size. */

# ls

core.5581 test test.c

/* gdb to debug core dump */

# gdb test core.5581
GNU gdb Red Hat linux (6.3.0.0-1.132.EL4rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu"...Using host libthread_db library "/lib64/tls/libthread_db.so.1".

Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib64/tls/libc.so.6...done.
Loaded symbols for /lib64/tls/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
#0 0x000000000040048b in main () at test.c:6

warning: Source file is more recent than executable.

6 *(char *)0 = 0;
(gdb) bt
#0 0x000000000040048b in main () at test.c:6

2. 栈溢出。

有关栈溢出的程序,请参见:一个测试栈大小的小程序

http://blog.163.com/huang_bp/blog/static/12311983720099150746901/edit/

# gcc -g test.c -o test -lpthread

# ls

test test.c

# ./test

...

Segmentation fault (core dumped)

# ls

core.5616 test test.c

# gdb test core.5616
GNU gdb Red Hat Linux (6.3.0.0-1.132.EL4rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu"...Using host libthread_db library "/lib64/tls/libthread_db.so.1".

Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib64/tls/libpthread.so.0...done.
Loaded symbols for /lib64/tls/libpthread.so.0
Reading symbols from /lib64/tls/libc.so.6...done.
Loaded symbols for /lib64/tls/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
#0 0x0000002a957c051e in vfprintf () from /lib64/tls/libc.so.6
(gdb) list
13
14 buffer[0]=i;
15 test(s);
16 }
17
18 int main()
19 {
20 pthread_t p;
21
22 pthread_create(&p, NULL, &test, NULL);

对于栈溢出的segment fault没有第一个定位方便,需要分析代码才能判断出原因。

Linux下core文件调试方法相关推荐

  1. Linux下core文件调试方法收藏

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://littlewhitetwo.blogbus.com/logs/35544335.html 在程序不寻常退出时,内核会在 ...

  2. linux core文件默认位置,linux下core文件

    linux下core文件 参考:http://www.cnblogs.com/li-hao/archive/2011/09/25/2190278.html 并整合其他参考资料 在程序不寻常退出时,内核 ...

  3. linux 下创建文件的方法

    linux  下创建文件的方法 touch  aaa.txt    创建一个叫aaa.txt的文件 echo   ""  >>  aaa.txt    创建一个叫aaa ...

  4. [Linux]core文件调试方法

    来源: shaovey的专栏 在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息).使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行 ...

  5. Linux下Chelsio T5调试方法

    T5是Chelsio的网络芯片,具体的硬件参数可以参考<Chelsio T5 HW Debug Guide V1.02.pdf>文档,如有需要请留言留下你的邮箱,我发给你. 现在我们着重讲 ...

  6. Linux下core文件介绍与使用方法

    背景 有时当我们在Linux下编程,程序运行时会出现以下提示: Segmentation fault (core dumped) 然后,程序崩溃,退出运行.发生这一问题的原因往往是程序中指针不规范使用 ...

  7. linux打开core文件,[转载]linux下core文件设置与查看

    程序异常推出时,内核会生成一个core文件(是内存映像以及调试信息).可以通过使用gdb来查看core文件,指示出导致程序出错的代码所在的文件和行数. 1.查看系统中core文件生成的开关是否打开 1 ...

  8. core文件 linux,Linux 下core文件的使用

    转储文件(core dump)本来是在程序运行出错的时候产生的.转储文件记录了进程出错时的内存映像,以及进程执行的上下文环境,如寄存器的值等.它的主要用途是在程序运行崩溃时记录下进程的瞬时情况,从而为 ...

  9. linux下的程序调试方法汇总

    原文地址:http://blog.csdn.net/guochaoxxl/article/details/51878051 搞电子都知道,电路不是焊接出来的,是调试出来的.程序员也一定认同,程序不是写 ...

最新文章

  1. java队列怎么实现线程_Java中利用线程和队列实现入库操作
  2. JavaScript中foreach()用法及使用的坑
  3. 形态学图像处理学习笔记
  4. 哲学家就餐问题php代码,Python实现哲学家就餐问题实例代码
  5. 2018 蓝桥杯省赛 B 组模拟赛(一)H.封印之门 最短路
  6. 剑指 Offer 03. 数组中重复的数字()
  7. 并查集算法c语言版,并查集及其C程序实现.doc
  8. 白噪声检测_科学家尝试用智能扬声器的白噪声来监测婴儿的呼吸运动
  9. 初学linux网络服务之DHCP实验
  10. 视频分配器的特点以及应用
  11. echarts3D地球
  12. 山东标梵讲解APP开发与技术公司之间的联系
  13. 如何进行产品运营数据分析?
  14. U盘无法在磁盘管理器中删除,显示不支持该操作的时候可以用以下的办法,亲测可以解决
  15. 尝美食、看演出、听音乐…南亚风情第壹城非遗文化节继续等你玩
  16. 机器学习必看书籍推荐
  17. 基于STM32指纹密码锁设计
  18. 推荐windows系统10款好用的软件,让你使用体验飞升
  19. 汽车的调谐器技术-Tuner
  20. CentOS7部署文件双向同步工具(unison)

热门文章

  1. 她说要介绍10000个开源项目?来!我们一起监督!
  2. 谷歌 Java 编程风格指南
  3. Python 获 Mozilla 和扎克伯格夫妇 40 余万美金资助
  4. stm32中用到的实时系统_适合STM32的三大嵌入式操作系统。
  5. adb查看手机cpu使用率_记录一下Unity打包Android在骁龙cpu上概率性卡死的问题
  6. java数据通道抽象为流_【java】IO流
  7. C语言指出下列程序的错误,2012年计算机二级C语言精编教程第二章(8)
  8. 分割2021算法合集
  9. Could not find a version that satisfies the requirement pox=0.2.6 (from pathos)
  10. Python TimedRotatingFileHandler 多进程环境下的问题和解决方法