linux系统下产生Segmentation fault 与 Segmentation fault (core dumped)!!!

最近在学习的过程中,遇到了Segment fault(段错误)的问题,经过一番查找资料,学到了一些相关知识,这里做一个梳理,以防以后在遇到类似的问题,并且希望能够帮助到大家一丝丝!

什么是Segment fault

在操作系统中,内存被划分为多个段(Segments),每个段存储着不同类型的数据,如代码段、数据段等。Segmentation Fault(段错误)是一种常见的程序错误,它通常发生在程序试图访问无效的内存地址或未初始化的内存区域,或者指针操作不当、数组越界、动态内存分配问题等原因造成的。这种错误通常由于程序编写错误或指针使用不当导致。当程序执行过程中发生Segmentation Fault错误时,操作系统会向程序发送一个SIGSEGV信号,导致程序停止运行。

Segmentation Fault的常见原因

  • 指针操作不当:当指针未初始化、指向无效地址或已释放的内存时,程序会尝试访问这些地址,导致Segmentation Fault错误,非法指针:使用空指针,或者随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump。。
  • 数组越界:程序在访问数组时,如果索引超出数组的实际范围,将会访问到无效的内存区域,从而引发Segmentation Fault
  • 动态内存分配问题:在使用动态内存分配函数(如malloc、new等)时,如果分配的内存未初始化或已释放,程序仍然尝试访问这些内存,同样会导致Segmentation Fault
  • 堆栈溢出.不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

如何解决Segmentation Fault错误。

实际上,我们可以通过仔细检查代码去逐一排查错误发生点,但是面对一个庞大的项目,涉及到的内容很多的时候,我们一一排查就会很吃力,有时候也是徒劳的。这时,我们就可以借助一些调试工具,来检查错误的位置。

下面来讲一下,在Linux系统中,如何借助gdb查看core文件来定位错误!

什么是core文件?

在Linux系统下,当程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息,编译时需要加上 -g -Wall)。我们使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。

如何生成core文件和大小限制

当系统程序运行产生 Segmentation Fault 而不是显示Segmentation fault (core dumped) 这说明,并没有产生code文件,我们需要执行以下命令来生成code文件,并限制文件大小。

  • 使用ulimit -c命令查看core文件的生成开关,如果结果为 0,则表示关闭了此功能,不会生成core文件。
  • 使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。
  • 但是如果生成的信息超过我们限制的文件大小,信息将会被裁剪,最终生成一个不完整的core文件或者根本就不生成,同时在调试此core文件的时候,gdb也会提示错误。所以我们常使用ulimit -c unlimited来表示core文件的大小不受限制。
  • 执行ulimit -a 察看当前系统设置
    在这里插入图片描述

注意:,这只对一个终端有效,再打开一个终端就无效了,要想整体修改,我们需要在系统 /etc/profile文件的最后,添加以下一行:

ulimit -c unlimited

然后,执行以下命令,使其生效:

source /etc/profile

这时候我们再次运行程序,就会发现Segmentation fault (core dumped),说明已经生成了code文件,但是它在哪呢?

查询core dump文件路径,可以通过以下命令查询:

cat /proc/sys/kernel/core_pattern

或者

/sbin/sysctl kernel.core_pattern

在这里插入图片描述
core文件的名称: core文件生成路径:输入可执行文件运行命令的同一路径下。若系统生成的core文件不带其它任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。

/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。

文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
可通过以下命令修改此文件:

echo "1" > /proc/sys/kernel/core_uses_pid 

修改core文件保存位置和文件名格:

修改/proc/sys/kernel/core_pattern, 可通过以下命令修改此文件:

echo "/corefile/core-%e-%p-%t" > core_pattern

可以将core文件统一生成到/corefile目录(必须保证有这个目录)下,也可以自己指定生成路径,产生的文件名为core-命令名-pid-时间戳,以下是参数列表:
%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 添加命令名

注意:

  • 目录proc文件系统是一个伪文件系统,以文件系统的方式为访问系统内核数据的操作提供接口。/proc目录的内容为系统启动时自动生成的,某写文件可改,某写文件不可改。比如可以通过修改proc的文件微调内核参数。使用vi可能无法成功编辑proc/sys/kernel/core_pattern,只能使用echo命令修改或者命令sysctl修改。sysctl命令如下:
sysctl -w "kernel.core_pattern=$core_dir/core_%e_%t" >/dev/null  
sysctl -w "kernel.core_uses_pid=0" >/dev/null

此时,我们就产生了code文件

在这里插入图片描述

如何利用code文件进行调试呢

  • 安装gdb
yum install -y gdb.x86_64
  • gdb进行查看core文件的内容, 以定位文件中引发core dump的行,gdb格式如下:
    gdb [exec file] [core file]
    [exec file]表示之前使用gcc编译的程序
    [core file]表示之前产生的dump文件
  • 基本GDB命令
    启动程序:run
    设置断点:b 行号|函数名
    删除断点:delete 断点编号
    禁用断点:disable 断点编号
    启用断点:enable 断点编号
    单步跟踪:next (简写 n)
    单步跟踪:step (简写 s)
    打印变量:print 变量名字 (简写p)
    设置变量:set var=value
    查看变量类型:ptype var
    顺序执行到结束:cont
    顺序执行到某一行: util lineno
    打印堆栈信息:bt
  • 切记:要在编译时,加上-g选项

举个栗子吧~

在这里插入图片描述
这里我们看到我们的code文件,接下来,使用以下命令,进行调试:
在这里插入图片描述
产生了以下结果:在这里插入图片描述
这里就会知道我们出现错误的位置。

新的问题又来了,我们从上图可以看出,缺少缺失独立的调试信息,该怎么办呢?

何为“独立的调试信息”?如果编写代码后使用gcc编译器进行编译时,若不加上-g编译参数,或后期使用strip工具进行二次处理,生成的二进制文件中将不带调试段信息,而gdb的调试都是基于该调试段进行的,在linux世界这部分内容往往也被称作debuginfo。
其次,各大发行版提供的二进制软件包为了缩小体积,且用户往往不需要对软件(包括内核、libc这类基础设施)本身进行调试,因此往往不带调试信息。由于在Linux环境下绝大部分程序都依赖于libc(包括最简单的hello world),若系统预装的libc未带调试段信息,将影响gdb对目标程序进行调试操作。

该如何解决呢?
  • 首先,执行以下命令
vim /etc/yum.repos.d/CentOS-Debuginfo.repo

将enable改为1
在这里插入图片描述

  • 安装glibc
yum install glibc
yum install yum-utils
debuginfo-install glibc-2.17-326.el7_9.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64 

实际上,最后一句命令就是图片中提示的。
在这里插入图片描述

再次使用gdb,就发现不会提示Missing separate debuginfos, u.....啦~
在这里插入图片描述

通过where,我们可以看一些具体的细节:
在这里插入图片描述

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

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

相关文章

python中numpy库使用

array数组 生成array数组 将list转化为array数组 import numpy as np np.array([1,2],typenp.int32)其中dtype定义的是元素类型,np.int32指32位的整形 如果直接定义dtypeint 默认的是32位整形。 zeors和ones方法 zeros()方法,该方法和ones()类似&a…

有什么方便实用的成人口语外教软件?6个软件教你快速进行口语练习

有什么方便实用的成人口语外教软件?6个软件教你快速进行口语练习 口语能力在语言学习中占据着重要的位置,因为它直接关系到我们与他人进行交流和沟通的效果。为了提高口语能力,很多成人选择通过外教软件进行口语练习,这些软件提供…

GNU Radio FFT模块结合stream to vector应用及Rotator频偏模块使用

文章目录 前言一、FFT 模块应用1、stream to vector 介绍2、创建 grc 图测试3、运行结果 二、频偏模块1、Rotator 简介2、创建 grc 图测试3、运行结果 前言 写个博客记录一下自己的蠢劲儿,之前我想用 FFT 模块做一些信号分析的东西,官方的 FFT 模块必须…

营销5.0时代,企业的痛如何解?

进入营销5.0阶段之后,许多企业都需解决连接客户效能低下的问题。针对这个问题,产品经理、软件开发公司包括个人开发者,要怎么找到有效的“解药”? 营销不仅每年都在变化,甚至每天都在变化。 ——现代营销学之父&…

【再探】设计模式—适配器、装饰及外观模式

结构型设计模式是用于设计对象和类之间关系的一组设计模式。一共有7种:适配器模式、装饰器模式、外观模式、桥接模式、组合模式、享元模式及代理模式。 1 适配器模式 需求:在软件维护阶段,已存在的方法与目标接口不匹配,需要个中…

论文阅读:RHO-1:Not All Tokens Are What You Need 选择你需要的 Tokens 参与训练

论文链接:https://arxiv.org/abs/2404.07965 以往的语言模型预训练方法对所有训练 token 统一采用 next-token 预测损失。作者认为“并非语料库中的所有 token 对语言模型训练都同样重要”,这是对这一规范的挑战。作者的初步分析深入研究了语言模型的 t…

记录一个练手的js逆向password

很明显 请求加密了password 全局搜索 有个加密函数(搜不到的可以搜临近的其他的关键字 或者url参数) 搜索的时候一定要仔细分析 我就没有仔细分析 我搞了好久 又是xhr又是hook的(还没hook到) 我当时也是疏忽了 我寻思这个也不是js文件 直到后来 我怎么也找不到 我就猜想 不…

代码随想录算法训练营DAY44|C++动态规划Part6|完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ

文章目录 完全背包理论基础完全背包问题的定义与01背包的核心区别为什么完全背包的循环顺序可以互换?CPP代码 ⭐️518.零钱兑换II思路CPP代码 ⭐️377. 组合总和 Ⅳ思路CPP代码 扩展题 完全背包理论基础 卡码网第52题 文章链接:完全背包理论基础 视频链接…

【数据结构与算法】力扣 102. 二叉树的层序遍历

题目描述 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: [[3],[9,20],[15,7]]示例 2&#x…

上证50etf期权到底该怎么玩?

今天期权懂带你了解上证50etf期权到底该怎么玩?ETF期权是一种股票市场上的金融衍生品,它是在交易所上市交易的期权合约,其标的资产是某个特定的交易所交易基金(ETF),如上证50指数ETF或沪深300指数ETF等。 上…

Git命令Gitee注册idea操作git超详细

文章目录 概述相关概念下载和安装常见命令远程仓库介绍与码云注册创建介绍码云注册远程仓库操作关联拉取推送克隆 在idea中使用git集成add和commit差异化比较&查看提交记录版本回退及撤销与远程仓库关联 push从远程仓库上拉取,克隆项目到本地创建分支切换分支将…

(✌)粤嵌—2024/5/7—除自身以外数组的乘积

代码实现&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/ int* productExceptSelf(int *nums, int numsSize, int *returnSize) {// 左乘积int l[numsSize];l[0] 1;for (int i 1; i < numsSize; i) {l[i] l[i - 1] * nums[…

Cesium学习——渲染、加载GeoJSON、调整位置

渲染概述 作者&#xff1a;当时明月在曾照彩云归 出处&#xff1a;https://www.cnblogs.com/jiujiubashiyi/p/17124717.html 1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库&#xff0c;使用WebGL来进行硬件加速图形&#xff0c;使用时不需要任何插件支持&#xf…

以中国为目标的DinodasRAT Linux后门攻击场景复现

概述 在上一篇《以中国为目标的DinodasRAT Linux后门剖析及通信解密尝试》文章中&#xff0c;笔者对DinodasRAT Linux后门的功能及通信数据包进行了简单剖析&#xff0c;实现了对DinodasRAT Linux后门心跳数据包的解密尝试。 虽然目前可对DinodasRAT Linux后门的通信数据包进…

SecretFlow学习指南(3)框架拆解和使用

“隐语”架构设计全貌 1.隐语框架设计思想 隐私计算是一个新兴的跨学科领域&#xff0c;涉及密码学、机器学习、数据库、硬件等多个领域。根据过去几年的实践经验&#xff0c;我们发现 ●隐私计算技术方向多样&#xff0c;不同场景下有其各自更为合适的技术解决方案 ●隐私计算…

Windows系统安装MySQL数据库详细教程

【确认本地是否安装mysql】 &#xff08;1&#xff09;按【winr】快捷键打开运行&#xff1b; &#xff08;2&#xff09;输入services.msc&#xff0c;点击【确定】&#xff1b; &#xff08;3&#xff09;在打开的服务列表中查找mysql服务&#xff0c;如果没有mysql服务&am…

麦肯锡精英高效阅读法笔记

系列文章目录 如何有效阅读一本书笔记 读懂一本书笔记 麦肯锡精英高效阅读法笔记 文章目录 系列文章目录序章 无法读书的5个理由无法读书的理由① 忙于工作&#xff0c;没时间读书无法读书的理由② 不知应该读什么无法读书的理由③ 没读完的书不断增多无法读书的理由④ 工作繁…

《QT实用小工具·五十三》会跑走的按钮

1、概述 源码放在文章末尾 该项目实现了会逃跑的按钮&#xff1a; 两个按钮&#xff0c;一个为普通按钮&#xff0c;另一个为会跑走的按钮 鼠标移到上面时&#xff0c;立刻跑掉 针对鼠标、键盘、触屏进行优化 随机交换两个按钮的文字、偶尔钻到另一个按钮下面、鼠标移开自…

2024.1.1 IntelliJ IDEA 使用记录

2024.1.1 IntelliJ IDEA 使用记录 下载设置文件编码maven 配置 插件可以中文语言包安装lombok 插件Smart Tomcat ( 根据需要安装)Smart Tomcat 配置 项目导入java 设置maven 配置 项目运行SpringBoot 项目运行tomcat 运行 (根据需要)相关依赖添加运行配置 下载 IntelliJ IDEA …

0基础学PHP有多难?

php作为web端最佳的开发语言&#xff0c;没有华而不实&#xff0c;而是经受住了时间考验&#xff0c;是一门非常值得学习的编程语言。 目前市场上各种网站、管理系统、小程序、APP等&#xff0c;基本都是使用PHP开发的&#xff0c;也侧面反映了PHP的需求以及学习的必要性&…