GDB调试core文件样例(如何定位Segment fault)

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 dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.

gdb [exec file] [core file]

如: gdb ./test test.core

 

四 样例

 

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下的段错误产生的原因及调试方法
http://www.upsdn.net/html/2006-11/775.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管理信息系统的开发与管理

{% extendsmuban.html %} {% block head %}输入{% endblock %} {% block main %} <div><div class"form-group"><label for"question">标题</label><textarea class"form-control" cols"50" rows"2&q…

python11-28笔记(1.6-1.7)

1.6 多类型传值和冗余参数多类型传值&#xff1a;比如def fun(x,y)&#xff0c;定义2个形参定义一个元组t(1,2),如果把元组当做实参传入到函数中&#xff0c;会报错 如何将元组当做不同类型的参数传入到函数中fun(t) 代表传入的是元组或者这样调用fun((1,2))注意实参的个数要和…

session机制详解以及session的相关应用

session是web开发里一个重要的概念&#xff0c;在大多数web应用里session都是被当做现成的东西&#xff0c;拿来就直接用&#xff0c;但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求&#xff0c;当碰到这样的情况时候我们需要更加深入的理解session的机制&am…

(转)Shell中获取字符串长度的七种方法

Shell中获取字符串长度的七种方法 原文&#xff1a;http://blog.csdn.net/jerry_1126/article/details/51835119 求字符串操作在shell脚本中很常用&#xff0c;下面归纳、汇总了求字符串的几种可能方法: 【方法一】:利用${#str}来获取字符串的长度 【方法二】:利用awk的length方…

linux下用core和gdb查询出现段错误的地方

有些时候我们在一段C代码的时候&#xff0c;由于对一个非法内存进行了操作&#xff0c;在程序运行的过程中&#xff0c;出现了"段错误"。呵呵&#xff0c;这种问题我想很多人会经常遇到。遇到这种问题是非常无语的&#xff0c;只是提示了"段错误"&#xff…

第一篇-Html标签中head标签,body标签中input系列,textarea和select标签

第十四周课程&#xff08;1-12章节&#xff09; HTML 裸体 CSS 穿华丽衣服 Javascript 动起来 一 HTML &#xff08;20个标签&#xff09; 1.我们的浏览器是socket客户端 2.一套规则&#xff0c;浏览器认识的规则 3.开发者&#xff1a; 学习html规则 开发后台程序&#xff1a…

opencv3.2.0 Cmake 3.8.0 + tdm-gcc-5.1.0-3

实测 tdm-gcc-5.1.0-3 tdm32-1 32位版本无法正确编译Opencv 3.2.0 会遇到诸多编译问题 解决办法 使用tdm-gcc-5.1.0-2 tdm64-1 64位版本转载于:https://www.cnblogs.com/fundou/p/6710209.html

什么是商品属性

一、什么是商品属性&#xff1a; Definition of Product Attributes A product attribute is a characteristic that defines a particular product and will affect a consumers purchase decision. Product attributes can be tangible (or physical in nature) or intangibl…

linux用户管理(1)----创建用户(adduser和useradd)和删除用户(userdel)

arm linux的系统用户管理&#xff1a; 1、删除root用户&#xff1a;deluser root2、删除tt用户:deluser tt3、建立root用户&#xff1a;adduser root4、修改用户密码&#xff1a;登录相应的用户后&#xff0c;用passwd来修改密码4、linux用户和密码的管理&#xff08;ftp&#…

前端性能优化之图像优化原理

前端性能优化中&#xff0c;图像的优化是非常重要的一环&#xff0c;为什么要说图像的优化呢&#xff0c;而不是我们常见的图片优化&#xff1f;因为这里的图像包括矢量图和位图&#xff0c;我们常说的图片优化是指位图的优化。这篇文章转载至奇舞周刊&#xff0c;大佬总结的非…

Lua开发学习4-普通循环和迭代器循环

说句实话&#xff0c;每当看到Lua代码&#xff0c;我都感觉是半个SQL代码&#xff0c;写起来还是感觉有点恐怖。 while循环&#xff1a; 与C#的while循环类似&#xff0c;没有什么好说的&#xff1b; --------Lua的while循环 while(condition)dostatementsend For循环 exp1为起…

什么是js的严格模式

设立严格模式的原因&#xff1a; - 消除Javascript语法的一些不合理、不严谨之处&#xff0c;减少一些怪异行为; - 消除代码运行的一些不安全之处&#xff0c;保证代码运行的安全&#xff1b; - 提高编译器效率&#xff0c;增加运行速度&#xff1b; - 为未来新版本的Javascrip…

Linux驱动设计ioctl函数的cmd参数不能为2

Linux驱动程序设计的时候偶然发现的ioctl()函数的cmd参数不能为2&#xff0c;如果为2,ioctl()函数返回-1&#xff0c;网上说就是这样的&#xff0c;正常&#xff0c;不知道为什么&#xff0c;stack overflow上有一个外国学友的建议&#xff1a; “In general, you want to comp…

代码解说Android Scroller、VelocityTracker

在编写自己定义滑动控件时经常会用到Android触摸机制和Scroller及VelocityTracker。Android Touch系统简单介绍&#xff08;二&#xff09;:实例具体解释onInterceptTouchEvent与onTouchEvent的调用过程对Android触摸机制须要用到的函数进行了具体的解释。本文主要介绍两个重要…

Effective_STL 学习笔记(四十四) 尽量使用成员函数代替同名的算法

有些容器拥有和 STL 算法同名的成员函数。 关联容器提供了 count、find、lower_bound、upper_bound 和 euqal_range list 提供了 remove、remove_if、unique、merge 和 reverse 大多数时候应该用成员函数代替手写算法&#xff0c;这样做的两个理由&#xff1a; 比起算法&#x…

(NFS移植到arm上)编译portmap和nfs-utils

为了在播放机上实现NFS服务器的功能&#xff0c;我们已经在uClibc中打开了完整RPC支持&#xff0c;并且在新编译的内核中打开了NFS服务器支持。此外还有两个软件包也是提供NFS服务所必需的&#xff1a;portmap和nfs-utils。portmap为RPC程序提供端口映射服务&#xff0c;nfs-ut…

HTML5上传预览

http://cobain-li.iteye.com/blog/2296538转载于:https://www.cnblogs.com/winyh/p/7850049.html

支付宝支付

1 申请商户平台 2 申请开放平台 3 申请APP支付 4 创建应用 (名称&#xff0c;logo) 5 生成RSA秘钥&#xff08;公钥&#xff0c;私钥&#xff09; 6 在应用中配置公钥 7 配置其他内容&#xff0c;包括iOS bundle ID。配置安卓包名&#xff0c;和签名。 获取appid&#xff0c;公…

HttpRequest Java原生代码封装

HttpRequest Java原生代码封装 get提交 post提交 name1value1&name2value2 的形式 json形式两种形式 package com.beisun.mbp.mbp.controller;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWrit…

Linux 系统目录

/ 根目录 /bin 存放必要的命令 /boot 存放内核以及启动所需的文件等 /dev 存放设备文件 /etc 存放系统的配置文件 /home 用户文件的主目录&#xff0c;用户数据存放在其主目录中 /lib 存放必要的运行库 /mnt 存放临时的映射文件系统&#xff0c;我们常把软驱和光驱挂装在这里的…