进程崩溃的根本原因(如何生成核心转储文件)

我们在使用VS出现程序崩溃的时候,程序出错时会显示错误信息,会定位到哪一行出错。下面我们将在Linux系统下分析进程崩溃的原因是什么怎么知道哪一行崩溃了


目录

一、进程崩溃的根本原因(结合底层分析)

二、如何知道哪一行崩溃了?

1、查看系统资源

2、设置核心转储文件的生成路径

3、运行程序

4、使用core文件定位崩溃所在行


一、进程崩溃的根本原因(结合底层分析)

开始运行以后,用户层的代码加载到内存中,进程被创建出来让CPU开始运行,CPU中有一个状态寄存器,记录着计算结果,这个时候计算出错,错误信息会记录在状态寄存器中

OS作为硬件的管理者,硬件的状态异常,OS会立马识别到,然后OS就会循着路径,反过来知道这份代码是哪个进程的,那就说明这个进程的代码有问题,所以OS会给这个进程发送一个信号来中止这个进程

此时父进程也就是bash通过waitpid获取到子进程的状态码status,status & 0x7F就是中止信号,中止信号对应的内容就是我们所看到的错误信息

注意:如果有必要,OS还会设置退出信息中的core dump标志位,core dump标志位默认是0,当被设置为1的时候,OS会将进程中的数据转储到磁盘,生成一个名为core的文件,方便我们后期调试。并非每种中止信号都会设置core dump标志位

二、如何知道哪一行崩溃了?

要想知道具体是哪一行崩溃了,关键在于上面的core dump生成的core文件,8号信号和11号信号会生成core文件,我们先编写一个浮点数运算错误,故意让进程崩溃。下面就来了解如何通过core文件知道哪一行崩溃了

1、查看系统资源

在命令行输入 ulimit -a 查看系统资源,我们会发现系统没有给core文件分配空间,这样的话,core dump的标志位在任何情况下都是 0 ,即不存储核心数据。

所以我们手动分配一下core文件的大小,在命令行输入 ulimit -c unlimited,这里的 -c 是core file size 对应的选项,unlimited 表示不限制转储文件的大小

2、设置核心转储文件的生成路径

可以使用 sysctl kernel.core_pattern 命令来查看当前的核心转储文件生成路径,默认情况如下

  •  |/usr/share/apport/apport: 它是一个特殊的核心转储处理程序(core dump handler),它是一个用于收集和报告故障的工具。当进程收到 SIGSEGV 或类似的信号时,内核将使用 kernel.core_pattern 中指定的处理程序来处理和处理核心转储文件
  • %p: 进程 ID。
  • %s: 目前正在运行的线程 ID。
  • %c: 产生核心转储文件的信号代码。
  • %d: 序列号,用于确保在同一目录中生成的核心转储文件具有唯一的名称。
  • %P: 父进程 ID。
  • %u: 用户名。
  • %g: 组名。
  • %E: 产生核心转储文件的可执行文件全路径。

可以使用 sudo sysctl -w kernel.core_pattern=<path_to_directory>/core 命令将其设为期望的路径。具体使用方法如下:

# 将 “ 当前目录 ” 设置为核心转储文件的生成路径
sudo sysctl -w kernel.core_pattern=/core

# 将 “ /home/gzx/core ” 设置为核心转储文件的生成路径
sudo sysctl -w kernel.core_pattern=/home/gzx/core

 

3、运行程序

make出错先暂时无视,因为还是会正常生成 执行文件,然后我们直接运行这个执行文件,和之前相比多了“core dumped”,说明核心数据被存起来了

 我们在当前目录下,就会看到core文件了

4、使用core文件定位崩溃所在行

其实本质上还是要通过gdb调试来定位,所以我们要在Makefile中加一个 -g 来显示详细的调试信息

(1) 重新make一下

(2) 命令行输入 gdb ./test 进入调试模式

(3) 输入core-file命令来解析core文件,即core-file  core

参考文章:

【问题记录】Ubuntu 22.04 环境下,程序报:段错误(核心已转储)怎么使用 core 文件和GDB调试器 解决?_linux段错误核心已转储怎么解决_拉伊卜的博客-CSDN博客

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值