『C/C++养成计划』Linux遇到Aborted (core dumped)的处理方法

这篇具有很好参考价值的文章主要介绍了『C/C++养成计划』Linux遇到Aborted (core dumped)的处理方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++项目遇到Aborted (core dumped)的处理方法

一. 关于Core Dump的分析

『C/C++养成计划』Linux遇到Aborted (core dumped)的处理方法

1.1. 什么是Core Dump

  • Core Dump是一个运行时错误。
  • Core的意思是内存, Dump的意思是扔出来, 堆出来。在开发(或使用)一个程序时,有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped)。虽然系统没事,但我们下次仍可能遇到相同的问题。这时候可以查看一下有没有形如core.PIDcore文件生成,这个文件便是操作系统把程序down掉时的内存内容扔出来生成的,让我们或是debugger做为参考。这个动作就叫作core dump
  • core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump简而言之,进程异常终止,进程用户空间的数据就会被写到磁盘。

1.2. 为何有时程序Down了,却没生成 Core文件

  • 有时候程序down了, 不像编译错误一样会提示到文件一行,而是没有任何信息。一种办法是用gdbsteplinux下调试工具gdb是很强大的调试器), 一步一步寻找,但要step一个上万行的代码让人难以想象。 我们还有更好的办法,这就是core file
  • 但是core文件却没有生成,这是因为core.PIDcore文件的生成跟你当前系统的环境设置有关系,系统默认core文件的大小为0 (注意core file size (blocks, -c) 0这行,这表示的是分配给core文件的长度(单位为字节,一个块的大小要分系统而定了),为0肯定是不得行的,那就修改之),我的下面截图是不为0的

1.3. 如何使用core文件

  • 发生core dump之后,使用gdb查看core文件的内容, 以定位文件中引发core dump的行,在在Linux下,查看core文件中的出错堆栈信息有二种方式,使用:gdb -c core.pid program_namegdb [program_name] [core.pid]可以进入gdb模式:
  • 在进入gdb后输入where并回车,就可以指出是在哪一行被Down掉,在哪个函数内,由谁调用等等。
  • 在进入gdb后输入 bt,用bt命令查看backtrace以检查发生程序运行到哪里,来定位core dump的文件->行。

『C/C++养成计划』Linux遇到Aborted (core dumped)的处理方法

二. 具体实例分析

  • 注意:如果程序是在docker中运行的,记得启动docker的时候加上--privileged 参数,该参数让 container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器

2.1. core dump的生成方式

  • Linux环境下进程发生异常而挂掉,通常很难查找原因,但是一般Linux内核给我们提供的核心文件,记录了进程在崩溃时候的信息。但是生成core文件需要设置开关,具体步骤如下:

2.1.1. 查看生成core文件的开关是否开启,输入命令

ulimit -a
  • 如果第一行core文件大小为0,没有开启。

『C/C++养成计划』Linux遇到Aborted (core dumped)的处理方法

2.1.2.使用ulimit -c [kbytes] 可以设置系统允许生成的core文件大小。

ulimit -c 0              #不产生core文件
ulimit -c 100            #设置core文件最大为100k
ulimit -c unlimited      #不限制core文件大小   
  • 执行命令 ulimit -c unlimited,然后ulimit -a查看core

『C/C++养成计划』Linux遇到Aborted (core dumped)的处理方法

  • 注意: 这样进程崩溃就可以生成core文件了,这种方法只能在shell中生效,需要此设置一直生效需要做如下设置
vim /etc/profile                                   
# 然后进入编辑模式,在profile文件中加入
ulimit -c unlimited
  • 保存退出,重启服务器,改文件就长久生效,或者
source /etc/profile

2.1.3. 指定生成文件的路径和名字

  • 默认情况下,core dump生成的文件名为core,而且就在程序当前目录下。新的core会覆盖已存在的core, 通过修改/proc/sys/kernel/core_uses_pid文件,可以控制core文件保存位置和文件格式。
vim /etc/sysctl.conf                                      
# 进入编辑模式,加入下面两行

kernel.core_pattern=/tmp/corefile/core_%t_%e_%p
kernel.core_uses_pid=0
  • 这里说一下core_pattern的命名参数如下:
%c 转储文件的大小上限
%e 所dump的文件名
%g 所dump的进程的实际组ID
%h 主机名
%p 所dump的进程PID
%s 导致本次coredump的信号
%t 转储时刻(由1970年1月1日起计的秒数)
%u 所dump进程的实际用户ID
  • 执行如下命令,设置修改马上生效,并且创建/tmp/corefile目录
sysctl -p /etc/sysctl.conf
mkdir /tmp/corefile

2.1.4. 使用GDB确定错误

gdb ./test_license /tmp/corefile/core_1680515069_test_license_24078 

『C/C++养成计划』Linux遇到Aborted (core dumped)的处理方法

  • 如果最后报出的信息是系统库,则可以在gdb下输入bt来调出堆栈信息,如果是多线程,则输入thread apply all backtrace 来显示所有线程栈回溯。我这里是原因是配置文件中忘记写use_keyframe_only

『C/C++养成计划』Linux遇到Aborted (core dumped)的处理方法文章来源地址https://www.toymoban.com/news/detail-406270.html

2.2. GDB 常用操作

  • 下边列出了GDB一些常用的操作。
启动程序:run
设置断点:b 行号|函数名
删除断点:delete 断点编号
禁用断点:disable 断点编号
启用断点:enable 断点编号
单步跟踪:next 也可以简写 n
单步跟踪:step 也可以简写 s
打印变量:print 变量名字
设置变量:set var=value
查看变量类型:ptype var
顺序执行到结束:cont
顺序执行到某一行: util lineno
打印堆栈信息:bt

三. 参考文献

  • Linux 生成 core dump的方法及设:https://www.cnblogs.com/flyinggod/p/13415862.html
  • Linux遇到Aborted (core dumped):https://blog.csdn.net/qq_35091353/article/details/112101738
  • C++项目经验(8)—— GDB快速定位程序崩溃(coredump)在哪行:https://blog.csdn.net/ROseeattimoo/article/details/127157248

到了这里,关于『C/C++养成计划』Linux遇到Aborted (core dumped)的处理方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】进程信号中的 core dump 标记位

    我们知道所有的程序最终运行起来,都会变成进程,进程在运行时可能会异常终止或崩溃,而Linux操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做 Core Dump (中文有的翻译成 核心转储 )。 保存的这个文件通常是:该进程的同目录下以 core.PID 的

    2024年02月14日
    浏览(40)
  • 【Linux】调试常见的应用程序奔溃“Segmentation fault (core dumped)”

    Linux程序开发者,日常遇到程序奔溃时,应该如何调试,如何寻找原因和解决呢?本文就介绍了遇到Segmentation fault (core dumped)问题时最常规的定位方法。 当你在命令行执行一个程序时,遇到Segmentation fault (core dumped)后,第一时间查看当前目录下是否产生了core-xxxxx文件。 如果没

    2024年02月10日
    浏览(47)
  • 【Linux】进程信号篇Ⅰ:信号的产生(signal、kill、raise、abort、alarm)、信号的保存(core dump)

    kill -l 可以查看所有信号: 其中,前面的数字就是信号,后面的大写英文就是信号名称,实际就是宏。 我们需要关注的是 1~31 号普通信号,关注他们有没有产生(可以用 0 或者 1 表示)。 所以,进程的 pcb 中,需要对产生的信号先用 位图 保存起来,再按照一定的顺序去处理

    2024年01月25日
    浏览(37)
  • GAN的训练技巧:炼丹师养成计划 ——生成式对抗网络训练、调参和改进

    生成对抗网络(GAN:Generative adversarial networks)是深度学习领域的一个重要生成模型,即两个网络(生成器和鉴别器)在同一时间训练并且在极小化极大算法(minimax)中进行竞争。这种对抗方式避免了一些传统生成模型在实际应用中的一些困难,巧妙地通过对抗学习来近似一些

    2023年04月08日
    浏览(38)
  • 解决方案:炼丹师养成计划 Pytorch如何进行断点续训——DFGAN断点续训实操

    我们在训练模型的时候经常会出现各种问题导致训练中断,比方说断电、系统中断、内存溢出、断连、硬件故障、地震火灾等之类的导致电脑系统关闭,从而将模型训练中断。 所以在实际运行当中,我们经常需要每100轮epoch或者每50轮epoch要保存训练好的参数,以防不测,这样

    2023年04月09日
    浏览(87)
  • Linux下ROS程序崩溃,程序段错误process has died [pid 20083, exit code -11, cmd /home GDB core dump 调试

           在Linux下可通过core文件来获取当程序异常退出(如异常信号SIGSEGV, SIGABRT等)时的堆栈信息。 core dump叫做核心转储 ,当程序运行过程中发生异常的那一刻的一个内存快照,操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态

    2024年02月12日
    浏览(46)
  • [nodejs]关于http.request遇到报错BadRequestError: request aborted怎么解决

    今天写demo时,调用http.request方法时遇到服务端报错BadRequestError: request aborted,点击进入报错的位置:  然后根据我写请求里有content-length:  发现是content-length乜有设置成和发送的消息内容的长度一致,把长度改成消息内容的长度就行了,或者注释掉也可以。

    2024年02月12日
    浏览(83)
  • core dump 路径定义以及监控

    Core Dump 是指进程异常退出时,操作系统将进程的内存状态保存到文件中,这个文件就是 Core Dump 文件,中文一般翻译为“核心转储”,哈,看起来还不如不翻译。 我们可以认为 Core Dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 du

    2024年02月08日
    浏览(34)
  • 安装faceswap过程中遇到some applications failed to install process aborted check details,如何解决?

    安装faceswap过程中遇到some applications failed to install process aborted check details,如何解决? 前提是我已经安装了anaconda,程序里面包含了python 3.8, 也在anaconda3处打开Powershell窗口输入指令: 更新包: conda update conda 包的安装: 通过conda指令安装numpy和matplotlib包: conda install numpy co

    2024年02月16日
    浏览(36)
  • 问题记录 | 执行python命令报错 713011 segmentation fault (core dumped) python

    最近在看DALLE2模型,新建conda虚拟环境之后使用命令 pip install dalle2_pytorch 安装,然后在MobaXterm中执行python命令,报错 但是在vscode中同样的命令能够顺利执行

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包