Qt Ubuntu20.04出现段错误核心已转储问题解决方案--之core dump

12 篇文章 0 订阅

我的系统是20.04,完全按照这篇文章搞定qt core dump,找到调试CORE文件的,并用GDB找到段错误。

以下是网上的这篇文章:

=============================================================

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

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

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

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

(2)利用core文件,使用GDB测试找到问题所在
3.解决过程

先看问题:

file
3.1 生成Core文件

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

file

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

file

  • 当前用户有效:在环境变量中添加命令
$ vim .bashrc

//在文件底部添加:
ulimit -c unlimited

//保存后,环境变量生效
$ source .bashrc

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

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

file

转到这个路径下去找是找不到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 添加程序名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

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

file

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

    1
    2
    3
    4
    5
    6
    7
    8

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

file

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

file

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

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

3.2.1 启动gdb

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

gdb  bin/run_vo  core

结果如下:

file

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

3.2.2 输入bt回溯定位

file

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

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

原文链接:https://blog.csdn.net/weixin_52402390/article/details/123900689

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ubuntu中,"段错误核心已转储)"是一种常见的错误提示。这通常表示程序在执行过程中发生了内存访问错误,例如访问了未分配的内存空间或者对已释放的内存进行了操作。这种错误可能由多种原因引起。其中一种可能的原因是指针操作的错误,比如对null指针进行解引用或者访问已被释放的指针。另外,某些系统服务(例如apport.service)在程序崩溃时会自动生成崩溃报告,这也会导致产生core文件。 如果你在Ubuntu中遇到了"段错误核心已转储)"的问题,你可以尝试以下步骤来解决: 1. 首先,你可以查看是否有相应的核心转储文件(core dump)生成。在默认情况下,core文件会生成在程序运行的当前目录下,但是有些情况下core文件的生成路径可能会被修改。你可以使用命令`ulimit -c`来查看core文件的生成路径,或者使用命令`find / -name "core.*"`来搜索core文件的位置。 2. 如果你找到了core文件,你可以使用调试工具(如GDB)来分析core文件,查看出错的位置和相关信息。你可以使用命令`gdb 可执行文件 core文件`来启动GDB调试器并加载core文件,然后使用命令`bt`或`backtrace`来查看调用栈信息。这些信息可以帮助你定位问题所在。 3. 如果你无法找到core文件或者无法解决问题,你可以尝试更新你的操作系统和软件包,以确保你使用的是最新的稳定版本。另外,你也可以尝试重新编译或重新安装出现问题的软件,以修复可能存在的错误。 希望这些信息能帮助你解决Ubuntu中的"段错误核心已转储)"问题。如果问题仍然存在,请提供更多详细的错误信息和操作步骤,以便我们能够更好地帮助你。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ubuntu段错误核心已转储)](https://blog.csdn.net/qq_41072096/article/details/118677000)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Ubuntu20.04出现段错误核心已转储问题解决方案](https://blog.csdn.net/m0_60028455/article/details/125977337)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值