-
2021-07-12 15:54:49
报错场景:
Linux ubuntu-users 4.15.0-112-generic #113~16.04.1-Ubuntu
ubuntu 16
问题描述:
在ubuntu :Linux ubuntu-users 4.15.0-112-generic #113~16.04.1-Ubuntu内核版本重启之后发现打开任何软件都会报:段错误(核心已转储)。
原因分析:
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIGSEGV信号,然后就会core dump)
在程序运行的过程中,有的时候我们会遇到Segment fault(段错误)这样的错误。这种看起来比较困难,因为没有任何的栈、trace信息输出。该种类型的错误往往与指针操作相关。往往可以通过这样的方式进行定位。
一 造成segment fault,产生core dump的可能原因
1.内存访问越界
a) 由于使用错误的下标,导致数组访问越界
b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符
c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。
2.多线程程序使用了线程不安全的函数
3.多线程读写的数据未加锁保护。对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump
4.非法指针
a) 使用空指针
b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型 的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它 时就很容易因为bus error而core dump.
5 堆栈溢出.不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误
二 配置操作系统使其产生core文件
首先通过ulimit命 令查看一下系统是否配置支持了dump core的功能。通过ulimit -c或ulimit -a,可以查看core file大小的配置情况,如果为0,则表示系统关闭了dump core。可以通过ulimit -c unlimited来打开。若发生了段错误,但没有core dump,是由于系统禁止core文件的生成。
三 用gdb查看core代码文件
发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.
适用于编译报错出现的段错误(核心已转储)gdb [exec file] [core file]
如: gdb ./test test.core
解决方案:
- ubuntu 查看修改线程默认栈空间大小 ulimit -s ( ulimit:控制shell程序的资源)
a、通过命令 ulimit -s 查看linux的默认栈空间大小,默认情况下 为10240 即10M
b、通过命令 ulimit -s 设置大小值 临时改变栈空间大小:ulimit -s 102400, 即修改为100M
c、可以在/etc/rc.local 内 加入 ulimit -s 102400 则可以开机就设置栈空间大小
d、在/etc/security/limits.conf 中也可以改变栈空间大小:
/etc/rc.local 设置开机时启用的配置和软件,在/etc/rc.local中将加密软件关闭
重新登录,执行ulimit -s 即可看到改为102400 即100M#<domain> <type> <item> <value> * soft stack 102400
- 在~/.bashrc加入ulimit -m unlimited (内存大小无限制)。
更多相关内容 - ubuntu 查看修改线程默认栈空间大小 ulimit -s ( ulimit:控制shell程序的资源)
-
Ubuntu20.04出现段错误核心已转储问题解决方案
2022-04-01 16:05:44ubuntu 20.04出现段错误核心已转储,使用GDB测试找不到core文件解决方案作为一个半路出家的linuc用户,coredump这个问题太让人抓狂了,网上找了好多都是不全面,不适应或者看不懂;现在终于解决了,记录一下防止以后出现还是无解,同时也分享给大家,希望大家能少踩一些坑。
目录
3.1.1 使用ulimit -a命令查看core文件大小限制
3.1.2 在终端输入 cat /proc/sys/kernel/core_pattern 查看core的生成路径。
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/apport
https://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
-
ubuntu编译高阶数组出现段错误(核心已转储)问题
2021-11-05 00:51:32如果这样写的话编译会出现段错误(核心已转储)问题。 解决方法: 用malloc开辟空间就行,c++中用new 例如定义一个3000*3000的矩阵 #include<stdio.h> #define N 3000 int main() { int **arr1; arr1...在ubuntu中编译C语言不允许直接定义高阶数组如: int arr[3000][3000];
如果这样写的话编译会出现段错误(核心已转储)问题。
解决方法: 用malloc开辟空间就行,c++中用new
例如定义一个3000*3000的矩阵
#include<stdio.h> #define N 3000 int main() { int **arr1; arr1 = (int **)malloc(N*sizeof(int*)); for(int i=0;i<N;i++) { arr1[i]=(int*)malloc(N*sizeof(int)); } return 0; }
这样段错误(核心已转储)问题就解决了。
-
ubuntu出现段错误 (核心已转储)
2020-03-09 10:26:14出现这样的错误一般是使用conda创建虚拟环境或者下载安装某个库时,下到一半网络中断,然后再一次使用同样的命令安装或者创建时出现的错误。如下图: 解决方法是清除未下载完的文件。可以去缓存的位置(…/...具体出现是conda create虚拟环境或者conda install出现Segmentation fault段错误(吐核)。出现这样的错误一般是使用conda创建虚拟环境或者下载安装某个库时,下到一半网络中断,然后再一次使用同样的命令安装或者创建时出现的错误。如下图:
解决方法是清除未下载完的文件。可以去缓存的位置(…/anaconda3/pkgs/)直接删除,不过不建议(不清楚缓存的包千万不要自己去删除,我被搞得自闭了[大哭])。可以在base env(非base env也行)中执行如下命令:
conda clean -a
注意,执行后刚刚下载的包会全部删除(其他的虚拟环境不受影响),得从新执行相关命令。
-
显示段错误,核心已转储怎么解决呢
2022-05-30 11:51:02显示段错误,核心已转储怎么解决呢,用了很多种方法都解决不了,有没有谁会啊 -
ubuntu下的core文件(段错误,核心已转储)
2021-05-13 02:12:04试了很多办法都没生成core文件,我用是ubuntu系统做了一下两条就在当前目录下生了core文件,然后就可以使用gdb调试1、ulimit -c filesize,修改core文件的大小,可以先用ulimit -a 查看core file size 对应的值2、... -
段错误(核心已转储)的问题原因
2022-02-14 22:43:54一个困扰已久的问题,今天终于明白了。 core,核心(线圈),没有半导体之前,...往往需要使用gdb工具查看核心转储文件,且需要采用一些设置保障核心文件能够被储存,方法如下: [Linux] 什么是 段错误(吐核) -
Ubuntu20.04下载cuda11.1时, 段错误(核心已转储)
2021-11-17 13:43:07Ubuntu20.04下载cuda11.1时, 段错误(核心已转储)问题描述:解决方案:更改栈大小即可解决问题功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合... -
Ubuntu——段错误 核心已转储
2017-03-06 15:27:26http://blog.sina.com.cn/s/blog_75bf554501019cvt.html 可以通过执行以下步骤定位Python程序运行时的段错误: gdb python #在gbd中 r main.py #当段错误出现时,输入: where -
段错误(核心已转储)-linux
2019-02-23 10:19:03在终端输入:ulimit -a 会发现提示很多 重点关注两个,一个是core file size,还有一个是stack size vi .bashrc 在bashrc文件最后加 ulimit -c unlimited ulimit -s 819200 保存后关闭终端 ... ... -
段错误(核心已转储)错误及解决过程
2021-04-22 20:09:49在Linux服务器上训练模型时,每当训练数据时程序就会自动停掉,报段错误(核心已转储),经过搜索有人说是程序越界了,stack太小了,于是我用ulimit -a 查看了Linux中stack的大小,然后又使用ulimit -c 10240修改... -
关于报错:段错误(核心已转储)
2022-04-09 21:32:01系统:ubuntu 尝试解决办法1:增大栈空间 在终端输入ulimit -a查看发当前栈空间大小 进行修改:ulimit -s 102400 参考链接 未解决 尝试解决办法2:修改线程以及内存占用 将num_workers设置为0 将pip_memery=False... -
Ubuntu16.04 段错误(核心已转储)的解决办法
2019-03-29 10:42:57由于软件需求我写了个测试软件,我定义两个u8 的buf为1280*720*8的大小,也差不多要接近于15M 的大小了,在语法没有错误的情况下直接报段错误(核心已转储)的错误。查找了相关的资料,在这里记录一下。 这里我们... -
ubuntu wget下载过程出现“段错误,核心已转储”解决方法
2020-06-11 17:09:08今天在ubuntu下载一个很大的文件时,下载到一半就出现“段错误,核心已转储”的错误,就直接中断了下载。网上查了下原因,找到如下解决办法: 1.使用断点续传继续下载 wget -c download_url:意思是从错误的地方继续... -
c++如何解决段错误 (核心已转储)
2021-06-18 17:35:26在后端优化中遇到了段错误 (核心已转储)问题,寻求解决方法。 首先通过不断的注释部分代码,运行,注释,运行,找到一个大概的范围是错在哪一块。 这类问题只能说根本原因是内存的非法操作。建议生成内存段错误转储... -
linux安装cuda10.2,发生s段错误 (核心已转储)的解决记录
2022-07-06 22:22:44Ubuntu18.04系统安装cuda时,发生s段错误 (核心已转储)的解决记录。 -
python,opencv,段错误(核心已转储)
2021-06-30 00:32:02在主脚本调用其他脚本,且主脚本和调用脚本都使用到了cv2.VideoCapture(0)。...出现如下错误: 解决方法:只使用一次VideoCapture() 主脚本和副脚本之间用形参传递 结果:成功解决问题 ... -
程序运行后出现,段错误,核心已转储。整了一晚上没解决,求大神帮个
2021-05-20 15:10:26程序运行后出现,段错误,核心已转储。整了一晚上没解决,求大神帮个0sd106zx2016.12.10浏览69次分享举报程序运行后出现,段错误,核心已转储。整了一晚上没解决,求大神帮个忙看看。。代码如下:#include #include #... -
ros下使用源码安装的pcl与opencv可视化出现“段错误,核心已转储”
2022-06-15 17:29:00ros下使用源码安装的pcl与opencv可视化出现“段错误,核心已转储” -
段错误(核心已转储) Segmentation fault (core dumped)(在Linux上如何得到一个段错误的核心转储)(笔记...
2021-09-30 16:58:53在Linux上如何得到一个段错误的核心转储 文章目录什么是段错误?步骤1:运行 valgrind如何获得一个核心转储ulimit:设置核心转储的最大尺寸kernel.core_pattern:核心转储保存在哪里kernel.core_pattern 和 Ubuntu... -
Ubuntu16.04—段错误 核心已转储Python调试
2019-09-12 15:12:58当运行python程序的时候,可以通过下面的操作找出出问题的部分。 gdb python #在gbd中 r main.py #当段错误出现时,输入: where -
段错误 (核心已转储)的一种
2020-09-11 10:10:23两台不同机器,调用yolov3做检测,结果一个机器正常,一个机器出现" 段错误 (核心已转储)"。代码完全一致,环境基本相似吧。后来查到只要 import matplotlib.pyplot as plt 就会报错,然后把所有plt的直接注释了。... -
labelimg出现段错误(核心已转储)
2020-08-11 18:56:16当想进入labelimg打标签的时候,出现了这个问题,怎么解决 原因分析 你的python包起了冲突,最好的解决方案,就是创建一个虚拟环境 创建labimg的虚拟环境 conda create -n labimg python=3.6 ... -
结构体数组访问溢出,在接收实时数据时,ROS会报错段错误 (核心已转储)
2022-03-27 17:07:15然后就有以下问题: 我以两种方式打印数据,在程序在跑一段时间后会强行中止(不超过10秒),都会出现段错误(核心已转储),上网查阅很可能是“数组、向量等类似的类型是否产生了越界访问” 在ros中运行一个节点,... -
ORB-SLAM3运行时出现“段错误(核心已转储)”解决方案
2022-05-09 20:58:06在ubuntu20上运行kitti双目数据集时: 解决方案 这是由于Settings.cc文件中有逻辑错误,在重载输出流运算符时,当相机类型为stereo,且为Rectified,打印相机2参数会调用“originalCalib2_”),(cameraType_ == ... -
VINS_Fusion运行时的段错误(核心已转储)解决方法
2021-05-16 01:53:52每次单目运行10s左右,双目1-2s时VINS的VINS_Node节点便会出现“断错误(核心已转储)”导致程序中断,其他RVIZ和数据发送节点都正常。问题解决路径:1、起初在网上查询段错误的解决方法,大部分都指明与内存有关,尤其...