Segmentation fault (core dumped)

错误简介

出现 “Segmentation fault (core dumped)” 错误通常意味着程序访问了未分配的内存或者越界访问了已分配内存之外的区域。

段错误通常发生在以下情况:

  1. 空指针解引用:尝试对空指针进行操作。
  2. 内存越界:访问了超出分配内存边界的区域。
  3. 栈溢出:递归深度过大或者局部变量过多导致栈空间不足。

在遇到段错误时,常用的调试方法包括:

  • 使用调试器如 gdb 来跟踪程序运行时的状态,从而定位具体的错误发生位置。
  • 检查代码中的指针操作,确保不会解引用空指针或者越界访问。
  • 考虑使用内存检测工具(如 Valgrind)来帮助检测内存泄漏或者非法内存访问问题。

为什么 try-catch 捕获不到?

在 C++ 中,try-catch 语句主要用于捕获异常,而不是用来处理诸如段错误这样的底层内存访问问题。

core文件的生成

在ubuntu环境下,默认不生成core文件,需要生成core文件时,需要使用ulimit进行设定。
ulimit -c 判断是否开启转储,为0 则没有开启

1. 修改core文件路径

在Linux系统中,/proc/sys/kernel/core_pattern文件用于指定核心转储文件的命名模式。这个文件通常是一个特殊的虚拟文件,修改它会影响系统在发生程序崩溃或异常时生成的核心转储文件的命名方式。

默认内容如下

|/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E

使用管理员模式,修改"/proc/sys/kernel/core_pattern"文件。

su
echo "core_%e_%p_%t" > /proc/sys/kernel/core_pattern

该路径为在执行文件当前路径创建相应的core文件,其中可选参数列表为:

%p - insert pid info filename
%u - insert current uid into filename
%g - insert current gid into filename
%s - insert signal that the coredump into the filename
%t - insert UNIX time that the coredump occurred into filename
%h - insert hostname where the coredump happened into filename
%e - insert coredumping executable name into filename

挑几个翻译下

- %e是执行文件名(可能被截断)
- %P是pid
- %t是coredump生成时间戳
- %s是触发生成coredump的信号值

注意:修改该文件后,如果重启Linux系统,该文件又会变回初始值。

2. 使能core文件生成

# 列出当前终端所有资源限制
ulimit -a # 设置生成core文件的大小:1024k
ulimit -c 1024# 设置生成core文件的大小:不受限制
ulimit -c unlimited

注意:在终端通过ulimit命令设置core file size,仅在当前终端有效。
3. 验证core文件生成
在修改core文件路径和开启core文件生成后,可以使用kill命令简单验证core文件生成。

kill -s SIGSEGV $$

core文件的分析

分析核心文件(core dump file)通常是为了理解程序崩溃的原因或故障的根本问题。以下是分析核心文件的一般步骤:

  1. 确认调试工具安装
    确保系统上安装了用于分析核心文件的调试工具,例如gdb(GNU Debugger)或者适用于特定语言和环境的其他调试工具。

  2. 获取符号信息
    如果程序是用编译器的调试选项编译的(例如-g选项),则核心文件通常包含了符号信息,可以更好地分析。如果没有符号信息,分析将更具挑战性。

  3. 加载核心文件
    使用调试工具加载核心文件和程序执行文件(如果可用)。例如,在使用gdb时,可以执行:

    gdb /path/to/your/program /path/to/core/file
    
  4. 分析堆栈信息
    使用调试工具查看堆栈回溯(backtrace),这将显示程序在崩溃时的函数调用路径。在gdb中,可以使用bt命令:

    (gdb) bt
    
  5. 查看变量和内存状态
    如果有符号信息,可以查看在崩溃时程序的变量值和内存状态。这对于理解程序崩溃的原因非常有帮助。

  6. 分析核心转储的代码段和数据段
    核心文件通常包含程序崩溃时的代码段和数据段的快照。分析这些内容有助于理解程序在崩溃时的状态。

  7. 查找原因并调试
    根据堆栈信息和变量状态,尝试确定程序崩溃的确切原因。这可能涉及到查找空指针解引用、内存泄漏、未处理的异常等问题。

  8. 记录和报告
    如果能够找到程序崩溃的原因或者问题点,记录并报告给开发团队或相关人员,以便进行修复或进一步的调查。

实战分析

  1. 编译时用-g选项
g++ -g -o test.out test.cpp
  1. 修改core文件生成路径到当前执行文件同目录
echo "core_%e_%p_%t" > /proc/sys/kernel/core_pattern
  1. 设置生成core文件的大小:不受限制
ulimit -c unlimited

4.在当前终端运行程序,因为ulimit设置 只在当前终端有效。

./test.out

5.程序出错后会在执行同目录下生成类似 core_test.ou_2024_1720274485 文件,用gdb工具分析

gdb ./test.out ./core_test.ou_2024_1720274485

使用 gdb 检查变量:

你可以在 gdb 中使用 print 命令查看 queue 和 front 的值。例如:

(gdb) print queue
(gdb) print front

相关资料:

  • https://blog.csdn.net/ftswsfb/article/details/119192789
  • https://blog.51cto.com/u_13536788/9686757

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

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

相关文章

大厂面试官赞不绝口的后端技术亮点【后端项目亮点合集(2)】

本文将持续更新~~ hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页:绝命C…

提高论文发表机会:Nature Communications 最新研究教你如何巧妙回复审稿意见

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 对于科研搬砖人来说,在论文投稿过程中,如何有效回复审稿意见才能得到审稿人的认可,一直是一个让人困惑又带点玄学的问题。 但是&#xff0c…

vue3 按钮复制粘贴功能

1.html <div click"copy(item.envelopePassword)" > 复制口令 </div> 2.utils 创建copy.js export const copy (val: string): void > {let { isSuccessRef } useCopyToClipboard(val) as anyif (isSuccessRef) {// 轻提示showNotify("复制…

【强化学习的数学原理】课程笔记--3(蒙特卡洛方法)

目录 蒙特卡洛方法MC Basic算法sparse reward MC Greedy 算法样本使用效率MC ϵ \epsilon ϵ-Greedy 算法一些例子 蒙特卡洛方法 第二节 推导贝尔曼最优公式中的&#xff1a; q π k ( s , a ) ∑ r P ( r ∣ s , a ) r γ ∑ s ′ P ( s ′ ∣ s , a ) v π k ( s ′ ) q…

vue3 ~ pinia学习

先看两个图 一个vuex 一个pinia 根据图看出来 pinia更简单了 那么具体怎么操作呢 我们来看下~ 第一步 下载 yarn add pinia # 或者使用 npm npm install pinia 第二步 注册 创建一个 pinia 实例 (根 store) 并将其传递给应用&#xff1a; import { createApp } from v…

代码随想录算法训练Day57|LeetCode200-岛屿数量、LeetCode695-岛屿的最大面积

岛屿数量 题目描述 力扣200-岛屿数量 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此…

前端vue后端java使用easyexcel框架下载表格xls数据工具类

一 使用alibaba开源的 easyexcel框架&#xff0c;后台只需一个工具类即可实现下载 后端下载实现 依赖 pom.xml <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependen…

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器(CPO)优化RF随机森林结合Adaboost分类预测(二分类及多分类)

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类&#xff09; 分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类…

docker 设置代理,通过代理服务器拉取镜像

docker 拉取目标镜像需要通过代理服务器进行时&#xff0c;可以通过为 docker 配置全局代理来实现。 注&#xff1a;Linux 上通过临时命令 export HTTP_PROXY 设置的代理&#xff0c;对 curl 这些有用&#xff0c;但是对 docker pull 不起作用。 示例 假设您的代理服务器地址是…

Nginx目录文件作用

查看文件 [rootlocalhost nginx]# pwd /opt/nginx [rootlocalhost nginx]# ll total 4 drwx------ 2 nobody root 6 Jun 6 09:11 client_body_temp drwxr-xr-x 3 root root 4096 Feb 28 14:30 conf drwx------ 2 nobody root 6 Feb 28 14:29 fastcgi_temp drwxr-xr-x…

【web前端HTML+CSS+JS】--- HTML学习笔记01

学习链接&#xff1a;黑马程序员pink老师前端入门教程&#xff0c;零基础必看的h5(html5)css3移动端前端视频教程_哔哩哔哩_bilibili 学习文档&#xff1a; Web 开发技术 | MDN (mozilla.org) 一、前后端工作流程 WEB模型&#xff1a;前端用于采集和展示信息&#xff0c;中…

Web漏洞扫描工具AppScan与AWVS测评及使用体验

AppScan和AWVS业界知名的Web漏洞扫描工具&#xff0c;你是否也好奇到底哪一个能力更胜一筹呢&#xff1f;接下来跟随博主一探究竟吧。 1. 方案概览 第一步&#xff1a;安装一个用于评测的Web漏洞靶场&#xff08;本文采用最知名和最广泛使用的靶场&#xff0c;即OWASP Benchma…

啥?你没听过SpringBoot的FatJar?

写在最前面&#xff1a; SpringBoot是目前企业里最流行的框架之一&#xff0c;SpringBoot的部署方式多数采用jar包形式。通常&#xff0c;我们使用java -jar便可以直接运行jar文件。普通的jar只包含当前 jar的信息&#xff0c;当内部依赖第三方jar时&#xff0c;直接运行则会报…

robotframework-appiumLibrary 应用 - 实现 app 自动化

1、安装appiumLibrary第三方库 运行pip命令&#xff1a;pip install robotframework-appiumlibrary 若已安装&#xff0c;需要更新版本可以用命令&#xff1a;pip install -U robotframework-appiumlibrary 2、安装app自动化环境。 参考我的另外一篇专门app自动化环境安装的…

设计模式探索:策略模式

1. 什么是策略模式&#xff08;Strategy Pattern&#xff09; 定义 策略模式&#xff08;Strategy Pattern&#xff09;的原始定义是&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而…

打卡第4天----链表

通过学习基础,发现我的基本功还得需要再练练,思路得再更加清晰明了,这样子做算法题才能驾轻就熟。每天记录自己的进步。 一、两两交换 题目编号:24 题目描述: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本…

[数据结构] 基于交换的排序 冒泡排序快速排序

标题&#xff1a;[数据结构] 基于交换的排序 冒泡排序&&快速排序 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 &#xff08;一&#xff09;冒泡排序 优化后实现&#xff1a; &#xff08;二&#xff09;快速排序 I、实现方法&#xff1a; &#…

opencv环境搭建-python

最近遇到了一些图像处理的需求&#xff0c;所以需要学习一下opencv,来记录一下我的学习历程。 安装numpy pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy安装matplotlib pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib安装opencv …

ctfshow web入门 web338--web344

web338 原型链污染 comman.js module.exports {copy:copy };function copy(object1, object2){for (let key in object2) {if (key in object2 && key in object1) {copy(object1[key], object2[key])} else {object1[key] object2[key]}}}login.js var express …

【ubuntu】挂载新磁盘

1、查看磁盘 sudo fdisk -l#Disk /dev/sdb: 4.0 TiB #Disk model: HNA641010BCF105 #Units: sectors of 1 * 512 512 bytes #Sector size (logical/physical): 512 bytes / 4096 bytes #I/O size (minimum/optimal): 4096 bytes / 4096 bytes #Disklabel type: gpt #Disk id…