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

进程信号中的 core dump 标记位

  • 一、什么是core dump
  • 二、core dump的使用
    • 1、开启core dump
    • 2、生成core file文件
    • 3、验证进程退出码里面的core dump标志位
  • 三、 core dump的应用

一、什么是core dump

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

保存的这个文件通常是:该进程的同目录下以core.PID的方式命名的文件。

二、core dump的使用

1、开启core dump

在Linux下core dump选项一般是被关闭的,我们可以通过ulimit -a查看当前Linux下系统资源的限制。

在这里插入图片描述

可以看到,core file size的大小是0,这说明系统不允许我们生成core file文件 ,我们可以使用命令设置生成的core file文件的大小的最大限制。

ulimit -c 10240

可以看到使用此命令以后我们生成的core file文件的大小的最大限制就变为了10240 blocks了。

在这里插入图片描述

2、生成core file文件

在Linux下有很多信号我们可以使用kill -l查看:

kill -l

在这里插入图片描述

但是并不是所有的信号引起的退出都会产生core file文件,只有有core标志的信号引起的退出才会产生core file文件,我们可以通过 man 7 signal 查看信号的详细信息

man 7 signal

在这里插入图片描述

11 号信号SIGSEGV是一个段错误的信号,当你的进程有内存越界等问题时,通常会收到该信号,可以看到该信号是有core标志的。

2号信号SIGINT其实就是我们常用的 Ctrl + C 键产生的信号,可以看到该进程是没有core标志的

下面我们用代码来验证:

#include <iostream>
#include <unistd.h>
using namespace std;int main()
{while (true){cout << "我是一个正在运行的进程..." << endl;sleep(1);}return 0;
}

对于这个死循环代码我们使用 Ctrl + C 来进行终止,观察是否有core file文件的产生。

在这里插入图片描述

可以看到并没有core file文件的生成。

我们再来看下面的代码:

#include <iostream>
#include <unistd.h>
using namespace std;int main()
{int* p = nullptr;*p = 10;cout << "野指针问题" << endl;return 0;
}

很明显这里会收到SIGSEGV信号,而SIGSEGV是有core标志的,因此此进程运行完毕以后应该生成core file文件。

运行结果:

在这里插入图片描述

可以看到确实生成了core file文件,我们打开该文件:

在这里插入图片描述
发现是乱码,这时因为core file里面是数据都是内存中的二进制数据,我们不使用特殊编码是看不懂里面的含义的。

3、验证进程退出码里面的core dump标志位

在以前我们学习进程等待时一定学习过:对于一个存储了进程的退出码的变量,其内部结构是这样的: 次第8位表示退出码,最低7位表示终止信号,终止信号的前一位就是core dump标志位。

在这里插入图片描述

按照这样的结构,如果我们创建一个子进程,让子进程直接遇到野指针收到SIGSEGV信号直接退出,然后我们在父进程里面检查core dump的标志位是否被置为1

#include <iostream>
#include <cstdlib>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;int main()
{pid_t id = fork();if (id == 0){// 子进程int* p = nullptr;*p = 10;cout << "野指针问题" << endl;exit(0);}int status = 0;wait(&status);cout << "子进程的退出信号:" << (status & 0x7F) << endl;cout << "子进程的core dump标志位:" << ((status >> 7) & 0x1) << endl;return 0;
}

运行结果:

在这里插入图片描述

当然这个结果是在core dump被开启的条件下,那么我们将core dump关闭运行的结果还会一致吗?

我们继续实验:
在这里插入图片描述

运行同样的代码,结果是:

在这里插入图片描述

可以看到 core dump标志位被改为了0

结论

  1. 同样的程序,在core dump是否开启时会有不同的效果。

  2. 如果core dump开启,遇到有core 标志的信号,会进行核心转储,并且退出码里面的core dump 标志位会被置为1

  3. 如果core dump关闭,遇到有core 标志的信号,也不会进行核心转储,并且退出码里面的core dump 标志位始终置为0

三、 core dump的应用

因为core file 文件内部有进程退出时的内存中的相关信息 ,所以我们可以用这些信息在gdb里面进行调试我们的代码,注意调试的程序要以debug模式发布。

例如下面的代码生成的core file 文件:

#include <iostream>
#include <unistd.h>
using namespace std;int main()
{int* p = nullptr;*p = 10;cout << "野指针问题" << endl;return 0;
}

在这里插入图片描述

我们在gdb里面进行调试,然后直接使用下面的命令,gdb就能直接帮我们找到问题的根源了,这种调试手段一般被称为事后调试

core-file core文件

在这里插入图片描述

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

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

相关文章

IL汇编语言读取控制台输入和转换为整数

新建一个testcvt.il&#xff1b; .assembly extern mscorlib {}.assembly Test{.ver 1:0:1:0}.module test.exe.method static void main() cil managed{.maxstack 1.entrypointldstr "\n请输入一个数字:"call void [mscorlib]System.Console::Write(string)call st…

PHP使用PhpSpreadsheet实现导出Excel时带下拉框列表 (可支持三级联动)

因项目需要导出Excel表 需要支持下拉 且 还需要支持三级联动功能 目前应为PHPExcel 不在维护&#xff0c;固采用 PhpSpreadsheet 效果如图&#xff1a; 第一步&#xff1a;首先 使用composer 获取PhpSpreadsheet 我这里PHP 版本 7.4 命令如下&#xff1a; composer r…

js-7:javascript原型、原型链及其特点

1、原型 JavaScript常被描述为一种基于原型的语言-每个对象拥有一个原型对象。 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff0c;直到找到一个名字…

基于边缘无线协同感知的低功耗物联网LPIOT技术:赋能智慧园区方案以及数字工厂领域

回到2000年左右&#xff0c;物联网的底层技术支撑还是“ZigBee”&#xff0c;虽然当时ZigBee的终端功耗指标其实也并不庞大&#xff0c;但是&#xff0c;“拓扑复杂导致工程实施难度大”、“网络规模小导致的整体效率低下”都成为限制其发展的主要因素。 LPWAN&#xff0c;新一…

TP4056锂电池充电模块 1A线性锂离子电池充电器

概述 TP4056是一款性能优异的单节锂离子电池恒流/恒压线性充电器。TP4056采用ESOP8封装配合较少的外围原件使其非 常适用于便携式产品&#xff0c;并且适合给USB电源以及适配器电源供电。 基于特殊的内部MOSFET架构以及防倒充电路&#xff0c;TP4056不需要外接检测电阻和隔离二…

GIS在地质灾害危险性评估与灾后重建中的应用教程

详情点击链接&#xff1a;GIS在地质灾害危险性评估与灾后重建中的实践技术应用 前言 地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质…

HIVE学习

1.什么是HIVE 1.HIVE是什么? Hive是由Facebook开源&#xff0c;基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。 大白话: HIVE就是一个类似于Navicat的可视化客户端, 2.HIVE本质 Hive是一个Hadoop客户端&a…

《面试1v1》ElasticSearch基础

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

Django使用uwsgi+nginx部署,admin没有样式解决办法

Django使用uwsginginx部署,admin没有样式解决办法 如果使用了虚拟环境则修改nginx.conf文件中的/static/路径为你虚拟环境的路径&#xff0c;没有使用虚拟环境则改为你python安装路径下的static server {listen 8008;server_name location; #改为自己的域名&#xff0c;没域名…

点击编辑变完成

<template><div><button click"dialogshowtrue">添加部门</button><div>部门列表</div><el-table ref"multipleTable" :data"form" tooltip-effect"dark" style"width: 100%">&l…

解决https页面加载http资源报错

为什么会报错&#xff1f; HTTPS页面加载HTTP资源会报错的原因是出于安全性考虑。 HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是一种通过使用SSL/TLS加密通信来保护数据传输的协议&#xff0c;它确保了客户端和服务器之间的安全连接。 当HTTPS页面尝试加…

钉钉群消息推送

1. 添加钉钉群机器人 PC端登录&#xff08;当前版本手机端无法进行推送关键词设置&#xff09;&#xff0c;群设置--> 机器人 --> webhook进行安全设置复制webhook对应的url 2. 群消息推送 钉钉群消息支持纯文本和markdown类型 2.1 调用示例源码 import com.alibaba.…