Linux下如何产生崩溃的core文件及如何调试

Linux可以查看调用堆栈的信息,但是需要更改Linux设置,使程序崩溃时候产生core文件。然后可以用gdb调试。

1.产生core文件方法

产生coredump文件的条件,首先需要确认当前会话的ulimit –c,若为0,则不会产生对应的coredump文件,需要进行修改和设置。

ulimit  -c unlimited  (可以产生coredump文件且不受大小限制),这种设置仅对当前生效,如果想永久生效

那么需要在

/etc/profile中加入以下一行,这将允许生成coredump文件

ulimit-c unlimited

 

2.更改core dump生成路径

因为core dump默认会生成在程序的工作目录,但是有些程序存在切换目录的情况,导致core dump生成的路径没有规律,

所以最好是自己建立一个文件夹,存放生成的core文件。

我建立一个 /data/coredump 文件夹,在根目录data里的coredump文件夹。

调用如下命令

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

将更改core文件生成路径,自动放在这个/data/coredump文件夹里。

%e表示程序名, %p表示进程id

3. 如何应用及调试步骤

(1)无论你是用Makefile来编译,还是直接在命令行手工输入命令来编译,都应该加上 -g 选项。

(2)一般来说,在默认情况下,在程序崩溃时,core文件是不生成的(很多Linux发行版在默认时禁止生成核心文件)。所以,你必须修改这个默认选项,在命令行执行:

       ulimit -c unlimited

       表示不限制生成的core文件的大小。

 (3)运行你的程序,不管用什么方法,使之重现Segmentation Fault错误。

 (4)这时,你会发现在你程序同一目录下,生成了一个文件名为 core.*** 的文件,即核心文件。例如,“core.12345”这样的文件。

  (5)用GDB调试它。假设你的可执行程序名为testcrash,则在命令行执行:

       gdb test core.12345

  (6)会显示一些堆栈信息,之后再(gdb)后输入bt,就可以查看crash点了。

       如:

。。。。

。。。。

#2(anonymous namespace)::TimerManagerLinux::process (this=0x24ae840, registration=...) at /home/buildbot/src/nena/nacm/timer/src/TimerManager_linux.cpp:222

#3 0x759542cc in na::comm::LocalProxy<na::iface::mgr::system::timer::TimerMgr>::TriggerSignIn<na::iface::mgr::system::timer::TimerMgr::TimerStatus, na::iface::mgr::system::timer::TimerMgr::TimerArgument>::operator() (process=<optimized out>, this=<optimized out>) at /home/buildbot/src/nena/nacl/include/comm/LocalProxy.hpp:384

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值