1.如果没有产生core文件,可以查询系统log

通过 sudo cat /var/log/messages |grep segfault 或者 sudo dmesg|grep segfault 获得
这种信息一般都是由内存访问越界造成的,不管是用户态程序还是内核态程序访问越界都会出core, 并在系统日志里面输出一条这样的信息。这条信息的前面分别是访问越界的程序名,进程ID号,访问越界的地址以及当时进程堆栈地址等信息,比较有用的信息是 最后的error number. 在上面的信息中,error number是4 ,下面详细介绍一下error number的信息: 
在上面的例子中,error number是6, 转成二进制就是110, 即bit2=1, bit1=1, bit0=0, 按照上面的解释,我们可以得出这条信息是由于用户态程序读操作访问越界造成的。 
error number是由三个字位组成的,从高到底分别为bit2 bit1和bit0,所以它的取值范围是0~7.

bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界 
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界 
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址

 2.Linux下打开core文件,定位segfault
source:http://blog.chinaunix.net/uid-24774106-id-344195.html
出现段错误,不容易定位到底是哪行代码出现了问题,segfault多次折磨的笔者死去活来,

查资料发现了定位段错误的方法。
 
    Linux下有核心转储文件即core文件,会把程序崩溃是的现场保存起来供gdb来调试。
打开的办法是 ulimit -c unlimited 。
    设置之前可以调用ulimit -c 查看当前的大小,如果是0,表示不生成core文件。unlimited 的含义是不论生成的core文件有多大,我都让系统生成core 文件。
 
    当时这个方法有个弊端是,在那个终端上设置的ulimit就在那个终端上生效,如果你在另一个终端上执行程序,你会发现,纵然有段错误,你也没生成core文件
 
    第二个办法是修改 /root/.bash_profile 文件添加一行  ulimit -S -c  unlimited 然后保存关闭文件。
 
     有很多linux系统/root 目录下并没有.bash_profile 文件,比如SUSE,这没有关系你自己vi 创建这个文件即可。
 
    修改完这个文件之后,执行source /root/.bash_profile,你就可以查看你的修改生效了没有。
    
    查看方法是 ulimit -c.你会发现,终端打印出 unlimited,表示你的配置生效了,你可以新开终端 执行 ulimit -c,发现新开终端也是unlimited 。
 
 
好,打开开关之后,你就可以跑你的有segfault的代码了。
一般core文件会生成在你的可执行文件所在的目录下。当然可以设定。
设定的方法是 修改 /proc/sys/kernel/core_pattern
这个文件不支持vi的方式修改,可以使用echo
如echo “/corefile/core-%p-%e-%t” > /proc/sys/kernel/core_pattern
这个语句的含义是将core文件生成在 /corefile/这个目录下
生成的文件名的格式是:“core”-“pid”-可执行程序名-段错误时间
%p ---------段错误进程的PID 
%e-----------发生段错误的可执行文件名
%t------- 发生段错误的时间
 
还有其他配置选项。
生成了core文件,你就可以调试了,调试方法是:
 
gdb -c core test
或 gdb test core
注test是你的可执行文件名。你就可以想用gdb调试文件一样调试你的core文件了。

linux 段错误常见处理方法的更多相关文章

  1. Linux段错误及GDB Coredump调试方法

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fa ...

  2. Linux awk命令常见使用方法介绍

    Linux awk命令常见使用方法介绍 By:授客 QQ:1033553122   awk运行方式有三种,其中常用的为命令行方式 awk [-F  field_separator]  '{patter ...

  3. gcc编译通过,运行却显示“段错误”的解决方法

    ​第一次在Liunx上(liunx mint 17)使用gcc编译c文件,竟然提示“找不到stdio.h",经过google后发现执行 sudo apt-get install build- ...

  4. PHP中NOTICE错误常见解决方法

    对于初学者,肯定会遇到不同的错误提示,比如:警告,致命,等等,其中NOTICE错误等级最低,页面中,好多类似 Notice: Use of undefined constant title - ass ...

  5. linux service命令常见使用方法

    service命令,顾名思义,就是用于管理Linux操作系统中服务的命令. 1. 声明:这个命令不是在所有的linux发行版本中都有.主要是在redhat.fedora.mandriva和centos ...

  6. Linux的段错误调试方法

    linux段错误的调试方法 相关博文: http://blog.csdn.net/htianlong/article/details/7439030 http://www.cnblogs.com/pa ...

  7. 转:Linux环境下段错误的产生原因及调试方法小结

    源地址:http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 补充:http://baike.baidu.com/link ...

  8. Linux环境下段错误的产生原因及调试方法小结(转)

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...

  9. Linux环境下段错误的产生原因及调试方法小结

    转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...

随机推荐

  1. wechat多开

    右键wechat查看属性,找到目标(wechat的执行路径),复制 然后在桌面新建文档,输入下面命令,想多开几个就复制几行 start 复制的目标 另存为bat文件,所有文件类型 双击运行

  2. s5_day7装饰器作业

    # 一:编写函数,(函数执行的时间是随机的) import time import random # def foo(): # time.sleep(random.randrange(1,5)) # ...

  3. Java集合(2):LinkedList

    一.LinkedList介绍 LinkedList也和ArrayList一样实现了List接口,但是它执行插入和删除操作时比ArrayList更加高效,因为它是基于链表的.基于链表也决定了它在随机访问 ...

  4. JVM内存杂记1

    大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ,   VM Stack( ...

  5. Django:学习笔记(4)——请求与响应

    Django:学习笔记(4)——请求与响应 0.URL路由基础 Web应用中,用户通过不同URL链接访问我们提供的服务,其中首先经过的是一个URL调度器,它类似于SpringBoot中的前端控制器. ...

  6. Oracle 集合操作

    在 Oracle 中提供了三种类型集合操作:并(UNION).交(INTERSECT).差(MINUS) · UNION:将多个查询的结果组合到一个查询结果之中,没有重复内容 · UNION ALL: ...

  7. Windows 10 调节缩略图背景透明度

    A goal is a dream with a deadline. Much effort, much prosperity. 用Windows 10 的朋友都知道 win10 确实挺好用,但是做的 ...

  8. linux 压缩以及解压命令

    转载:http://blog.csdn.net/mmllkkjj/article/details/6768294/ tar-c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件- ...

  9. ggplot2 specific command

    # By default, the same scales are used for all panels. You can allow # scales to vary across the pan ...

  10. java中Hashtable集合的常用方法

    实现Map集合的方法这里就不在讲了 https://www.cnblogs.com/xiaostudy/p/9510763.html public Object clone() 返回Hashtable ...