作为一个半路出家的linuc用户,coredump这个问题太让人抓狂了,网上找了好多都是不全面,不适应或者看不懂;现在终于解决了,记录一下防止以后出现还是无解,同时也分享给大家,希望大家能少踩一些坑。

目录

1.什么是段错误

2. 解决方案

3.解决过程

3.1 生成Core文件

3.1.1 使用ulimit -a命令查看core文件大小限制

3.1.2 在终端输入 cat /proc/sys/kernel/core_pattern 查看core的生成路径。

3.1.3 修改core文件生成路径

3.2 GDB测试

3.2.1 启动gdb

3.2.2 输入bt回溯定位

参考资料:


1.什么是段错误

core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIGSEGV信号,然后就会core dump)。产生段错误的原因大致上有三类:访问不存在的内存地址、访问系统保护的内存地址和访问只读的内存地址

2. 解决方案

网上的资料虽然比较乱,但是也提供了一个解决问题的思路:

(1)设置core文件,找到段错误生成的core文件

(2)利用core文件,使用GDB测试找到问题所在

3.解决过程

先看问题:

3.1 生成Core文件

3.1.1 使用ulimit -a命令查看core文件大小限制

可以看到core file size的大小为0,文件根本装不进,需要使用 ulimit -c unlimited 修改这个文件的大小

修改成功后,按照网上的说法,再运行程序就会生成core文件,一般路径和可执行程序一个路径。但是在ubuntu20.04下,怎么也找不到去哪里了(反正我的是这样),因此需要查看core文件的生成路径。

3.1.2 在终端输入 cat /proc/sys/kernel/core_pattern 查看core的生成路径。

转到这个路径下去找是找不到core文件,这是因为ubuntu的服务apport.service。自动生成崩溃报告,官方为了自动收集错误的。我们肯定想到修改路径的办法,那就演示一下会怎么样。

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 添加程序名

我直接用echo "/home/boy/corefile/core-%e-%p-%t"> /proc/sys/kernel/core_pattern 进行修改,结果如图

3.1.3 修改core文件生成路径

因为我们修改的core_pattern文件是只读文件,没法这样修改。所以要换一种思路,修改不了就先停掉apport.service,这个服务对我们来说基本没用。

错误报告的部分操作命令如下:

//1.启用错误报告
sudo systemctl enable apport.service
//或
sudo service apport start//2.关闭错误报告
sudo systemctl disable apport.service
//或
sudo service apport stop

所以,用sudo service apport stop关闭错误报告后我们再看core文件的路径会怎么样

可以看到,路径发生了变化,再运行一次试试,看现在能不能生成core

可以看到,运行完后用ll查看生成了core文件,方法有限,下面就是GDB调试找到错误的位置了。

3.2 GDB测试

GDB详细说明请看参考资料大佬的整理,这里只记录一下我怎么测试的

3.2.1 启动gdb

输入gdb 运行文件  core文件,例如:

gdb  bin/run_vo  core

结果如下:

可以看到对内存出现非法访问时将收到段错误信号SIGSEGV下面就是出错的位置,我们还可以使用backtrace回溯定位问题。

3.2.2 输入bt回溯定位

可以看到现在的报告更加详细。

到此,coredump问题已经解决,输入q,即可退出gdb,剩下就是修改问题部分了。

参考资料:

(69条消息) ubuntu20.04 如何生成core文件_Jqivin的博客-CSDN博客https://blog.csdn.net/Jqivin/article/details/121908435?ops_request_misc=&request_id=&biz_id=102&utm_term=ubuntu20.04%E6%89%BE%E4%B8%8D%E5%88%B0core%E6%96%87%E4%BB%B6&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-121908435.142^v5^article_score_rank&spm=1018.2226.3001.4187(69条消息) Ubuntu18.04 产生不了core文件之解决办法_qq76211822的博客-CSDN博客_/usr/share/apport/apporthttps://blog.csdn.net/sz76211822/article/details/112181664?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164879853216782248562235%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164879853216782248562235&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-3-112181664.142^v5^article_score_rank&utm_term=%E4%BF%AE%E6%94%B9%2Fetc%2Fdefault%2Fapport&spm=1018.2226.3001.4187(69条消息) linux下gdb调试方法与技巧整理_花开蝶自来-liu的博客-CSDN博客_gdb调试https://blog.csdn.net/niyaozuozuihao/article/details/91802994 (69条消息) c++如何解决段错误 (核心已转储)_肥鼠路易的博客-CSDN博客_核心已转储https://blog.csdn.net/weixin_44991673/article/details/118030855

Ubuntu20.04出现段错误核心已转储问题解决方案相关推荐

  1. c语言 段错误 核心已转移,c语言使用DES_ncbc_encrypt以及段错误 (核心已转储) 解决...

    1.首先安装ssl库文件 sudo apt-get install libssl-dev 引入头文件 #include 2.定义调用方法 void call_cbc(){ DES_cblock key ...

  2. c++如何解决段错误 (核心已转储)

    在后端优化中遇到了段错误 (核心已转储)问题,寻求解决方法. 首先通过不断的注释部分代码,运行,注释,运行,找到一个大概的范围是错在哪一块. 这类问题只能说根本原因是内存的非法操作.建议生成内存段错误 ...

  3. linux下gdb使用core文件调试程序,解决“段错误核心已转储“的问题

    一.core文件介绍以及用途: 1.core文件是什么? core文件包含了程序运行时的内存状态.寄存器状态.堆栈指针.内存管理信息以及各个函数使用堆栈信息等等: 当程序运行过程中出现段错误(Segm ...

  4. 段错误 (核心已转储)_向大厂看齐!为自己的程序增加自动转储的功能!

    如果你还不清楚什么是转储文件,不知道什么时候需要转储文件,请参考转储文件系列文章的第一篇 -- 转储文件知多少. 前言 不知道各位小伙伴有没有遇到过 微信 或者 QQ 崩溃的情况.它们在崩溃的时候都会 ...

  5. 运行orbslam2出现 段错误 (核心已转储)_JDK 14已发布快速预览16个新特性

    JDK 14已经于2020年3月17日如期发布.本文介绍JDK 14特性. JEP 305: instanceof的模式匹配(预览) 通过对instanceof运算符进行模式匹配来增强Java编程语言 ...

  6. 非法指令 (核心已转储) 彻底解决方案

    问题描述 之前在Nano上,经常运行程序的时候,遇到一个问题:非法指令 (核心已转储). 原因分析: 在/usr/lib/python3/dist-packages/这个路径下,Nano自带了很多配置 ...

  7. ORB-SLAM3运行时出现“段错误(核心已转储)”解决方案

    编译成功,运行时如下图 在ubuntu20上运行kitti双目数据集时: 解决方案 这是由于Settings.cc文件中有逻辑错误,在重载输出流运算符时,当相机类型为stereo,且为Rectifie ...

  8. mysql出现core dumped_mysql-为什么我遇到分段错误(核心已转储)?

    这是我要运行的代码.它可以编译,并且工作良好,直到昨天. #include #include int main(int argc, char **argv) { MYSQL *conn; MYSQL_ ...

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

    问题原因: core 指核心(线圈),没有半导体之前,使用线圈内存,指代内存. 可执行文件是分段存储的,加载进内存也是分段的,如代码段.数据段.堆.栈等,段错误的原因往往是碰到了不该碰到的内存位置(如 ...

最新文章

  1. flash里alert
  2. admin密码对应的MD5值,16位和32位,admin解密自己留着方便.
  3. 利用pip3安装包只能在python2中调用
  4. python多线程并发编程技术_同步线程 - Python并发编程教程™
  5. 【英语学习】【Daily English】U01 Greetings / L02 What brings you here?
  6. 《剑指 Offer I》刷题笔记 11 ~ 19 题
  7. php安装包进行安装吗,php的一键安装包有哪些php环境搭建
  8. 232.栈实现队列(力扣leetcode) 博主可答疑该问题
  9. 小米范工具系列之一:小米范 web查找器
  10. 嵌入式Linux开发工具(vim的使用)
  11. 户外带什么耳机好、户外骨传导耳机推荐
  12. erp系统不能连接服务器配置,erp系统云服务器怎么配置
  13. Django-rest-framework简介
  14. 苹果iPhone5 16G长沙九方现货售8199元
  15. excel 将图片的链接URL 显示为图片 转
  16. python 从源码讲解random模块
  17. PW2330原厂规格书12V转5V,3.3V稳压电源芯片,1A-3安
  18. 2022 最新版前端工程师面试题手册
  19. 轻知识库︱apple.Turicreate数据结构SGraph以及关系网络SNA分析(三)
  20. 手机如何访问电脑本地服务器、读取本地服务器数据

热门文章

  1. php学习----什么是常量
  2. 四元数左乘右乘_四元数——旋转
  3. java函数式编程:四大Function
  4. 建设工程安全生产知识题库100题
  5. java避免装箱_深入剖析Java中的装箱和拆箱
  6. 【python做接口测试的学习记录day10——pytest自动化测试框架之接口加密】
  7. jquery定时器:setTimeout()、setTimeout() 重复点击触发多次
  8. Docker安装Nginx教程步骤
  9. c#俄罗斯方块视频教程下载地址[陈广老师]
  10. js实现滑动验证码功能