Ubuntu 20 core dumped(核心已转储)问题分析

问题原因:

core 指核心(线圈),没有半导体之前,使用线圈内存,指代内存。

可执行文件是分段存储的,加载进内存也是分段的,如代码段、数据段、堆、栈等,段错误的原因往往是碰到了不该碰到的内存位置(如系统保留段、代码段不能被修改,使用空指针等)。

核心已转储就是说进程结束之前,内存已被储存,可以用于程序员翻看程序的“临终遗言”来定位问题。往往需要使用gdb工具查看核心转储文件,且需要采用一些设置保障核心文件能够被储存,方法如下:

参考 段错误(核心已转储)的问题原因_爱笑的木头的博客-CSDN博客_段错误 (核心已转储)

解决方法:

1.用 ulimit -a 查看 core file size 项是否为 unlimited。如果不是,修改成unlimited (指令:ulimit -c unlimited)

2.检查core产生路径是否正确,  cat /proc/sys/kernel/core_pattern,如果路径不存在,则设置:echo "./core-%e-%p-%s" > /proc/sys/kernel/core_pattern

core设置主要命令解析:

 //控制core文件的文件名中是否添加pid作为扩展
echo "1" > /proc/sys/kernel/core_uses_pid  
//设置core文件的输出路径和输出文件名,这里我的路径是/home/boy/corefile,文件名就是后面的部分
echo "/home/boy/corefile/core-%e-%p-%t"> /proc/sys/kernel/core_pattern 
 
//参数说明
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加程序名

3. 但因为ubuntu官方为了自动收集错误,设置了服务apport.service,用于自动生成崩溃报告,我们还是无法获取core文件。

因此可以暂时将该服务关闭。

//1.关闭错误报告
sudo systemctl disable apport.service
//或
sudo service apport stop


//2.启用错误报告
sudo systemctl enable apport.service
//或
sudo service apport start

apport被关闭后

重新执行程序,使用ll 命令应该就可以在当前路径下看到core文件了

4. gdb定位错误位置

gdb  可执行文件  core文件

还可以输入bt(backtrace 缩写) 命令回溯定位,可以查看下程序崩溃时的堆栈信息,定位具体程序出错函数

注意:

在使用如下命令时

gdb  可执行文件  core文件

需要找到可执行文件的位置

ROS节点可以在launch中设置gdb进行调试:

参考:

ROS 代码调试常用方式配置_ros 调试_忒懂先生的博客-CSDN博客 

ROS 学习踩坑笔记2-如何解决使用GDB工具进行ROS debug_HarwardWu的博客-CSDN博客

<node name="client" pkg="example_3" type="client" output="screen" launch-prefix="xterm-egdb--args"/>

以下同语句代表不同的debug方式,主要使用以下两个语句
launch-prefix="xterm -e gdb --args"  //xterm命令表示新建一个terminal显示bug信息,-e参数告诉xterm执行剩下的命令行
launch-prefix="gdb -ex run --args" // 表示在运行launch的对话框内,显示bug信息

参考:

Ubuntu20.04出现段错误核心已转储问题解决方案_Abdullah al-Sa的博客-CSDN博客_段错误,核心已转储

已经设置了ulimit,为什么还是没有core文件 - 菜鸡徐思 - 博客园

[Linux] 什么是 段错误(吐核)?_giturtle的博客-CSDN博客_段错误(吐核)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值