Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3846094
  • 博文数量: 146
  • 博客积分: 3918
  • 博客等级: 少校
  • 技术积分: 8584
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-17 13:52
个人简介

个人微薄: weibo.com/manuscola

文章分类

全部博文(146)

文章存档

2016年(3)

2015年(2)

2014年(5)

2013年(42)

2012年(31)

2011年(58)

2010年(5)

分类: LINUX

2011-05-30 23:32:24

    出现段错误,不容易定位到底是哪行代码出现了问题,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
注test是你的可执行文件名。你就可以想用gdb调试文件一样调试你的core文件了。


阅读(13013) | 评论(2) | 转发(3) |
给主人留下些什么吧!~~

Heartwork2011-10-26 16:40:12

因为在linux上的core文件的格式是core.进程ID,当年打开了这个选项之后,core文件直接把硬盘占满了……(因为coedump的进程挂掉之后父进程就重启fork一个新的继续干活)

beyond3333502011-06-07 02:19:50

我收你做师傅吧!为师你意下如何?