如何生成core文件进行项目调试?

        由于项目前期的调试错误比较多,或者有某些隐藏危险:例如内存泄漏;偶尔才出现一次,如果没有捕捉错误的手段可能好不容易出现的机会就溜走了,所以生成core文件是必要的,发生段错误会生成相应的core文件,使用gdb可以查询错误原因和堆栈情况。

生成core文件

        那么如何在程序发生段错误时生成core文件呢?可以写一个脚本run.sh,脚本内容如下:

#!/bin/sh
#启用核心转储功能,将核心转储大小的软限制设置为无限制。前提是文件系统没有禁用该功能
ulimit -c unlimited
#下面这两行都能设置生成core文件的名字及路径,使用任意一行即可;生成core文件的路径(/mmc_data/core)必须可写,最好chmod 777 /mmc_data/core -R
#默认是在当前目录想生成名为core的文件
echo "/mmc_data/core/coremat" > /proc/sys/kernel/core_pattern
#执行你要运行的程序
./test

        每次使用脚本run.sh运行程序,当程序发生错误时即可在/mmc_data/core/目录下生成test_core文件。

生成不同名字的core文件

        有时候在系统中运行不止一个程序,为了防止不同程序产生的core文件互相覆盖就需要针对不同的程序生成不同的core文件,具体方法如下:

ulimit -c unlimited
#当然,如果你想每次出错都生成不同名字的core文件可以进行如下设置:core文件的名称将包含可执行文件名、进程 ID 和生成时间戳的信息。
#下行命令也可以实现让多个程序发生错误时生成不同名字的core文件,方便调试
sysctl -w kernel.core_pattern="/mmc_data/meta8k/core/core-%e-%p-%t"
#当然使用如下命令也是可以的:
echo "/mmc_data/core/core-%e-%p-%t" > /proc/sys/kernel/core_pattern 
#echo 'core-%e-%p-%t1-%t2' | sudo tee /proc/sys/kernel/core_pattern 这样也是可以的
#当然也可以指定core文件数量:
echo '2' | sudo tee /proc/sys/kernel/core_uses_pid #这个一般不用没必要,因为%e 后缀进程名就能实现存不同程序的core
: '
占位符介绍,可根据自己的需求使用:
%e:可执行文件的名称
%p:进程的 ID
%h:主机名
%s:信号名称
%t:时间戳
%u:用户名
%g:组名
'
./test

        然后使用gdb工具分析即可:

#执行如下命令进入gdb分析
gdb test test_core
#进入之后执行bt即可看到错误位置及错误原因
bt

        注意:编译test程序时必须使用-g参数,不然不能使用gdb工具,关于gdb的更多用法参考的的另一篇博客。

关闭core文件生成

        如果想要关闭core文件的生成执行以下命令:

#核心转储大小的软限制设置为0
ulimit -c 0
#清空配置文件
echo "" > /proc/sys/kernel/core_pattern
#注意:如果是清空配置文件,需要再设置配置文件才能再生成core:echo "/mmc_data/core/coremat" > /proc/sys/kernel/core_pattern

        想要了解更多linux及音视频技术,关注我后续更新!

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迷茫的蜉蝣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值