【linux学习指南】Linux进程信号产生(三) 硬件异常除零出错?野指针异常?core文件

请添加图片描述

文章目录

  • 📝前言
  • 🌠模拟除0
    • 🌉除0出错?
    • 🌉野指针异常?
  • 🌠⼦进程退出coredump
    • 🌉Core Dump
  • 🚩总结


📝前言

硬件异常被硬件以某种⽅式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执⾏了除以0的指令,CPU的运算单元会产⽣异常,内核将这个异常解释为SIGFPE信号发送给进程。再⽐如当前进程访问了⾮法内存地址,MMU会产⽣异常,内核将这个异常解释为SIGSEGV信号发送给进程。

🌠模拟除0

在这里插入图片描述

#include <iostream>
#include <string>
#include <sys/types.h>
#include <unistd.h>
#include <wait.h>int main()
{if(fork() == 0){sleep(1);int a = 10;a /= 0;exit(0);}int status = 0;waitpid(-1, &status, 0);printf("exit sinal: %d, core dump: %d\n", status&0x7F,(status>>7)&1);return 0;
}

在这里插入图片描述
在这里插入图片描述

🌉除0出错?

在这里插入图片描述

  1. 操作系统如何检测进程内部错误
    当进程执行指令时,CPU 硬件会在执行某些操作(如除法运算)的过程中检查操作数是否合法。以整数除法为例,CPU 的算术逻辑单元(ALU)在执行除法操作时,会检查除数是否为零。如果除数为零,这是一种非法的算术操作,硬件会自动触发一个异常条件。

整个程序的执行流程是

首先,在地址内存空间中加载好了代码和数据,开始:通过地址寄存器eax进行存储操作,存储10,存储时将寄存器ebx的值设为0CPU中存在一个状态寄存器,称为eFlags寄存器。

CPU的算术逻辑单元(ALU)在执行操作时,会检查除数是否为0。如果除数为0,这是一种非法操作,会触发异常条件。此时,硬件会将状态eFlags寄存器中的溢出标志位置为1

OS系统要不要知道CPU(硬件)内部出错了?
操作系统需要知道CPU内部出现了错误。它可以通过找到引发异常的进程,然后向该进程发送信号来终止该进程。但即使进程被杀死,其他进程仍需要进行调度和上下文切换等操作。

OS会说:谁把我的CPU搞坏了,接下来就要通过信号杀掉进程!,那OS怎么知道是哪个信号?此时进程中,我们把8号信号补捉了,但是我们进程没有立刻退出,立刻被杀掉!因为进程还需要进行被OS调度:切换(保存上下文数据),进行(比如后续的代码操作)等等

当这个异常进程被杀死前,OS需要保存上下文数据,保证下次再调用时恢复。因此,在上下文切换时,需要保存eax,ebx,ecx,eFlags等一系列寄存器的值。当保存好后,OS调度下一个进程,CPU寄存器只有一套,把上下文数据恢复进来,这时,Efalgs标志位被恢复,溢出标志位一直都是1~这个时候,这个进程又开始死循环异常

总结
无论OS需要等待该死循环进程结束后,进程假如后面还有代码,没有退出,再进行后面代码处理,Efalgs标志位,溢出标志位一直都是1~,一样死循环。当重新进来下一个进程,恢复执行时,上下文数据,Efalgs标志位被恢复,溢出标志位一直都是1,会再次触发异常,陷入死循环。

总的来说,这段描述了CPU发生除零错误时的异常处理流程,包括硬件触发异常、OS发现错误、终止异常进程,以及进程切换时上下文保存等步骤。整个过程涉及CPU硬件和操作系统的协作。

🌉野指针异常?

在这里插入图片描述
首先数据和代码在磁盘中,然后磁盘的随物理地址加载到物理内存中,物理内存中也有地址,这个地址为虚拟地址,页表右边是虚拟地址,左边是物理地址。pc存放的下一条执行指令的虚拟,经过pc指令传递给MMU硬件和CR3命令的处理,虚拟地址就可以找到页表的右边的物理地址,当除0这个指令传递给MMU去查页表时,访问0号地址,但是零号地址是无法访问的,这个时候MMU开始出错,一出错,找到这个进程,处理这个进程,进程还不能退出,后续代码也许需要执行,OS需要对进程进行调度,切换,执行,而MMU也有一套寄存器,当这个寄存器除以0出错之后,然后寄存器喵喵也会进行上下文的数据保存。保存之后,他就即使OS调度下一个进程,或者切换这个状态,寄存器状态一直同样也为一,MMU会一直报错,然后就会进程异常终止,但一直没退出。

总结
由此可以确认,我们在C/C++当中除零,内存越界等异常,在系统层⾯上,是被当成信号处理的。

注意:
通过上⾯的实验,我们可能发现:
发现⼀直有8号信号产⽣被我们捕获,这是为什么呢?上⾯我们只提到CPU运算异常后,如何处理后续的流程,实际上OS会检查应⽤程序的异常情况,其实在CPU中有⼀些控制和状态寄存器,主要⽤于控制处理器的操作,通常由操作系统代码使⽤。状态寄存器可以简单理解
为⼀个位图,对应着⼀些状态标记位、溢出标记位。OS会检测是否存在异常状态,有异常存在就会调⽤对应的异常处理⽅法。

除零异常后,我们并没有清理内存,关闭进程打开的⽂件,切换进程等操作,所以CPU中还保留上下⽂数据以及寄存器内容,除零异常会⼀直存在,就有了我们看到的⼀直发出异常信号的现象。访问⾮法内存其实也是如此,⼤家可以⾃⾏实验。

🌠⼦进程退出coredump

在这里插入图片描述

int main()
{if(fork() == 0){sleep(1);int a = 10;a /= 0;exit(0);}int status = 0;waitpid(-1, &status, 0);printf("exit sinal: %d, core dump: %d\n", status&0x7F,(status>>7)&1);return 0;
}

指令:wks@hcss-ecs-ab43:~/code/signal24$ man 7 signal

   Standard signalsLinux supports the standard signals listed  be‐low.   The second column of the table indicateswhich standard (if any) specified  the  signal:"P1990"  indicates that the signal is describedin the original POSIX.1-1990 standard;  "P2001"indicates  that  the  signal was added in SUSv2and POSIX.1-2001."P1990"  indicates that the signal is describedin the original POSIX.1-1990 standard;  "P2001"indicates  that  the  signal was added in SUSv2and POSIX.1-2001.Signal      Standard   Action   Comment────────────────────────────────────────────────────────────────────────SIGABRT      P1990      Core    Abort signal from abort(3)SIGALRM      P1990      Term    Timer signal from alarm(2)SIGBUS       P2001      Core    Bus error (bad memory access)SIGCHLD      P1990      Ign     Child stopped or terminatedSIGCLD         -        Ign     A synonym for SIGCHLDSIGCONT      P1990      Cont    Continue if stoppedSIGEMT         -        Term    Emulator trapSIGFPE       P1990      Core    Floating-point exceptionSIGHUP       P1990      Term    Hangup detected on controlling terminalor death of controlling processSIGILL       P1990      Core    Illegal InstructionSIGINFO        -                A synonym for SIGPWRSIGINT       P1990      Term    Interrupt from keyboardSIGIO          -        Term    I/O now possible (4.2BSD)SIGIOT         -        Core    IOT trap. A synonym for SIGABRTSIGKILL      P1990      Term    Kill signalSIGLOST        -        Term    File lock lost (unused)SIGPIPE      P1990      Term    Broken pipe: write to pipe with noreaders; see pipe(7)SIGPOLL      P2001      Term    Pollable event (Sys V);synonym for SIGIOSIGPROF      P2001      Term    Profiling timer expiredSIGPWR         -        Term    Power failure (System V)SIGQUIT      P1990      Core    Quit from keyboardSIGSEGV      P1990      Core    Invalid memory referenceSIGSTKFLT      -        Term    Stack fault on coprocessor (unused)SIGSTOP      P1990      Stop    Stop processSIGTSTP      P1990      Stop    Stop typed at terminalSIGSYS       P2001      Core    Bad system call (SVr4);see also seccomp(2)SIGTERM      P1990      Term    Termination signalSIGTRAP      P2001      Core    Trace/breakpoint trapSIGTTIN      P1990      Stop    Terminal input for background processSIGTTOU      P1990      Stop    Terminal output for background processSIGUNUSED      -        Core    Synonymous with SIGSYSSIGURG       P2001      Ign     Urgent condition on socket (4.2BSD)SIGUSR1      P1990      Term    User-defined signal 1SIGUSR2      P1990      Term    User-defined signal 2SIGVTALRM    P2001      Term    Virtual alarm clock (4.2BSD)SIGXCPU      P2001      Core    CPU time limit exceeded (4.2BSD);see setrlimit(2)SIGXFSZ      P2001      Core    File size limit exceeded (4.2BSD);see setrlimit(2)SIGWINCH       -        Ign     Window resize signal (4.3BSD, Sun)The  signals  SIGKILL  and  SIGSTOP  cannot  becaught, blocked, or ignored.

在这里插入图片描述

🌉Core Dump

在这里插入图片描述

  • SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump,现在我们来验证一下。
  • ⾸先解释什么是CoreDump。当⼀个进程要异常终⽌时,可以选择把进程的⽤⼾空间内存数据全部保存到磁盘上,⽂件名通常是core,这叫做CoreDump。
  • 进程异常终⽌通常是因为有Bug,⽐如⾮法内存访问导致段错误,事后可以⽤调试器检查core⽂件以查清错误原因,这叫做Post-mortem Debug (事后调试)。
  • 一个进程允许产生多大的core文件取决于进程的Resource Limit(这个信息保存在PCB中)。默认是不允许产生core文件的,因为core文件中可能包含用户密码等敏感信息,不安全。
  • 在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。首先用ulimit|命令改变shell进程的Resource Limit ,如允许core|文件最大为1024K: $ ulimit -c1024

在这里插入图片描述

core-file core :事后调试


🚩总结

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/62517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计Python异常流量检测 流量分类 流量分析 网络流量分析与可视化系统 网络安全 信息安全 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

基于SpringBoot的电脑配件销售系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

win10系统部署RAGFLOW+Ollama教程

本篇主要基于linux服务器部署ragflowollama&#xff0c;其他操作系统稍有差异但是大体一样。 一、先决条件 CPU ≥ 4核&#xff1b; RAM ≥ 16 GB&#xff1b; 磁盘 ≥ 50 GB&#xff1b; Docker ≥ 24.0.0 & Docker Compose ≥ v2.26.1。 如果尚未在本地计算机&#xff…

docker使用(镜像、容器)

docker基础使用 文章目录 前言1.镜像操作1.1命令介绍1.2.案例实操1.2.1查找镜像1.2.2下载镜像1.2.3查看当前镜像 2.容器操作2.1命令2.1.1容器创建与启动2.1.2. 容器查看2.1.3. 容器操作2.1.4. 容器删除2.1.5. 容器日志2.1.6. 容器内文件操作2.1.7. 容器内命令执行2.1.8. 其他常…

服务器数据恢复—raid6阵列硬盘被误重组为raid5阵列的数据恢复案例

服务器存储数据恢复环境&#xff1a; 存储中有一组由12块硬盘组建的RAID6阵列&#xff0c;上层linux操作系统EXT3文件系统&#xff0c;该存储划分3个LUN。 服务器存储故障&分析&#xff1a; 存储中RAID6阵列不可用。为了抢救数据&#xff0c;运维人员使用原始RAID中的部分…

AIGC训练效率与模型优化的深入探讨

文章目录 1.AIGC概述2.AIGC模型训练效率的重要性3.模型优化的概念与目标4.模型优化策略4.1 学习率调节4.2 模型架构选择4.3 数据预处理与增强4.4 正则化技术4.5 量化与剪枝 5.代码示例6.结论 人工智能领域的发展&#xff0c;人工智能生成内容&#xff08; AIGC&#xff09;越来…

Ubuntu Server 22.04.5 从零到一:详尽安装部署指南

文章目录 Ubuntu Server 22.04.5 从零到一&#xff1a;详尽安装部署指南一、部署环境二、安装系统2.1 安装2.1.1 选择安装方式2.1.2 选择语言2.1.3 选择不更新2.1.4 选择键盘标准2.1.5 选择安装版本2.1.6 设置网卡2.1.7 配置代理2.1.8 设置镜像源2.1.9 选择装系统的硬盘2.1.10 …

Qt之样式表设置总结。。。持续更新

参考文章链接如下: Qt样式表之一:Qt样式表和盒子模型介绍 Qt样式表之二:QSS语法及常用样式 Qt样式表之三:实现按钮三态效果的三种方法 Qt样式表之一:QSS名词解释 Qt样式表之二:常用控件qss Qt样式表之三:QSS奇技淫巧 样式表介绍 Qt样式表是一个可以自定义部件外观的十…

ASP.NET Web(.Net Framework) Http服务器搭建以及IIS站点发布

ASP.NET Web&#xff08;.Net Framework&#xff09; Http服务器搭建以及IIS站点发布 介绍创建ASP.NET Web &#xff08;.Net Framework&#xff09;http服务器创建项目创建脚本部署Http站点服务器测试 Get测试编写刚才的TestWebController.cs代码如下测试写法1测试写法2 Post测…

贪心算法基础解析

贪心算法 贪心算法的核心思想是&#xff1a;在每个阶段选择当前状态下最优的选择&#xff0c;从而希望通过局部最优的选择达到全局最优。 53. 最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#…

【初阶数据结构和算法】二叉树顺序结构---堆的定义与实现(附源码)

文章目录 一、堆的定义与结构二、堆的实现1.堆的初始化和销毁堆的初始化堆的销毁 2.向上调整算法和入堆向上调整算法入堆 3.向下调整算法和出堆顶数据向下调整算法出堆 4.堆的有效数据个数和判空堆的有效数据个数堆的判空 5.取堆顶数据 三、堆的源码 一、堆的定义与结构 本篇内…

【北京迅为】iTOP-4412全能版使用手册-第二十章 搭建和测试NFS服务器

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

大数据新视界 -- 大数据大厂之 Hive 函数库:丰富函数助力数据处理(上)(11/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【Docker】Docker配置远程访问

配置Docker的远程访问&#xff0c;你需要按照以下步骤进行操作&#xff1a; 1. 在Docker宿主机上配置Docker守护进程监听TCP端口 Docker守护进程默认只监听UNIX套接字&#xff0c;要实现远程访问&#xff0c;需要修改配置以监听TCP端口。 ‌方法一&#xff1a;修改Docker服务…

LuaForWindows_v5.1.5-52.exe

Releases rjpcomputing/luaforwindows GitHub #lua C:\Users\Administrator\Desktop\test.lua print("Hello lua&#xff01;") print("ZengWenFeng 13805029595")

antd table 自定义表头过滤表格内容

注意&#xff1a;该功能只能过滤可一次性返回全部数据的表格&#xff0c;通过接口分页查询的请自主按照需求改动哈~ 实现步骤&#xff1a; 1.在要过滤的列表表头增加过滤图标&#xff0c;点击图标显示浮窗 2.浮窗内显示整列可选选项&#xff0c;通过勾选单选或者全选、搜索框来…

【分页查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

CSP-J初赛不会备考咋办?

以下备考攻略仅供参考&#xff0c;如需资料请私信作者&#xff01;求支持&#xff01; 目录 一、编程语言基础 1.语法知识 -变量与数据类型 -运算符 -控制结构 -函数 2.标准库的使用 -输入输出流 -字符串处理 -容器类&#xff08;可选&#xff09; 二、算法与数据结构 1.基…

火语言RPA流程组件介绍--键盘按键

&#x1f6a9;【组件功能】&#xff1a;模拟键盘按键 配置预览 配置说明 按键 点击后,在弹出的软键盘上选择需要的按键 执行后等待时间(ms) 默认值300,执行该组件后等待300毫秒后执行下一个组件. 输入输出 输入类型 万能对象类型(System.Object)输出类型 万能对象类型…

springboot vue 开源 会员收银系统 (12)购物车关联服务人员 订单计算提成

前言 完整版演示 http://120.26.95.195/ 开发版演示 http://120.26.95.195:8889/ 在之前的开发进程中&#xff0c;我们完成订单的挂单和取单功能&#xff0c;今天我们完成购物车关联服务人员&#xff0c;用户计算门店服务人员的提成。 1.商品关联服务人员 服务人员可以选择 一…