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.rhkb.cn/news/370521.html

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

相关文章

Linux配置固定ip地址

虚拟机的Linux操作系统,其IP地址是通过DHCP服务获取的 DHCP:动态获取IP地址,即每次重启设备后都会获取一次,可能导致IP地址频繁变更。 一般系统默认的ip地址设置都是自动获取,故每次系统重启后ip地址都可能会不一样&a…

Redis的使用(二)redis的命令总结

1.概述 这一小节,我们主要来研究一下redis的五大类型的基本使用,数据类型如下: redis我们接下来看一看这八种类型的基本使用。我们可以在redis的官网查询这些命令:Commands | Docs,同时我们也可以用help 数据类型查看命令的帮助文档。 2. 常…

FastAPI教程——部署

部署 部署FastAPI应用程序相对容易。 部署是什么意思 部署应用程序意味着执行必要的步骤以使其可供用户使用。 对于Web API来说,通常涉及将上传到云服务器中,搭配一个性能和稳定性都不错的服务器程序,以便你的用户可以高效地访问你的应用…

Ubuntu安装Docker

一,Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有…

论文回顾 | CVPR 2021 | How to Calibrate Your Event Camera | 基于图像重建的事件相机校准新方法

论文速览 | CVPR 2021 | How to Calibrate Your Event Camera | 基于图像重建的事件相机校准新方法 1 引言 在计算机视觉和机器人领域,相机校准一直是一个基础而又重要的问题。传统的相机校准方法主要依赖于从已知校准图案中提取角点,然后通过优化算法求解相机的内参和外参。这…

DDR3(三)

目录 1 预取1.1 什么是预取1.2 预取有哪些好处1.3 结构框图1.4 总结 2 突发2.1 什么是突发2.2 突发与预取 本文讲解DDR中常见的两个术语:预取和突发,对这两个概念理解的关键在于地址线的低位是否参与译码,具体内容请继续往下看。 1 预取 1.1…

创新配置,秒级采集,火爆短视频评论抓取

快速采集评论数据的好处 快速采集评论数据是在当今数字信息时代的市场趋势分析和用户反馈分析中至关重要的环节。通过准确获取并分析大量用户评论,您将能够更好地了解消费者的需求、情感和偏好。集蜂云采集平台提供了一种简单配置的方法,使您能够快速采…

离线安装arm架构Firefox

离线安装Firefox浏览器及其插件在ARM架构的设备上(如树莓派、部分Android设备或其他采用ARM处理器的Linux系统)可能需要一些特殊步骤,因为默认情况下,大多数浏览器和插件都是为x86架构设计的。对于ARM架构,你需要找到特…

Leetcode 338. 比特位计数

给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a; 0 --> 0 1 --> 1…

C#/WPF 自制截图工具

在日常使用电脑办公时&#xff0c;我们经常遇到需要截图然后保存图片&#xff0c;我们往往需要借助安装截图工具才能实现&#xff0c;现在我们通过C#自制截图工具&#xff0c;也能够轻松进行截图。 我们可以通过C#调用WindousAPI来实现截图&#xff0c;实例代码如下&#xff1a…

uni-app x 跨平台开发框架

目录 uni-app x 是什么 和Flutter对比 uts语言 uvue渲染引擎 组合式API的写法 选项式API写法 页面生命周期 API pages.json全局配置文件 总结 uni-app x 是什么 uni-app x&#xff0c;是下一代 uni-app&#xff0c;是一个跨平台应用开发引擎。 uni-app x 是一个庞…

计算机网络-IP组播基础

一、概述 在前面的学习交换机和路由协议&#xff0c;二层通信是数据链路层间通信&#xff0c;在同一个广播域间通过源MAC地址和目的MAC地址进行通信&#xff0c;当两台主机第一次通信由于不清楚目的MAC地址需要进行广播泛洪&#xff0c;目的主机回复自身MAC地址&#xff0c;然后…

Linux多进程和多线程(三)进程间通讯-信号处理方式和自定义处理函数

进程间通信之信号 信号信号的种类 信号在操作系统中的定义如下: 信号的处理流程在 Linux 中对信号的处理⽅式 自定义信号处理函数 信号的发送 kill() 函数:raise() 函数: 示例 : 创建⼀个⼦进程&#xff0c;⼦进程通过信号暂停&#xff0c;⽗进程发送 终⽌信号等待信号 pause()…

【鸿蒙学习笔记】@Link装饰器:父子双向同步

官方文档&#xff1a;Link装饰器&#xff1a;父子双向同步 目录标题 [Q&A] Link装饰器作用 [Q&A] Link装饰器特点样例&#xff1a;简单类型样例&#xff1a;数组类型样例&#xff1a;Map类型样例&#xff1a;Set类型样例&#xff1a;联合类型 [Q&A] Link装饰器作用…

深度学习模型加密python版本

支持加密的模型: # torch、torch script、onnx、tensorrt 、torch2trt、tensorflow、tensorflow2tensorrt、paddlepaddle、paddle2tensorrt 深度学习推理模型通常以文件的形式进行保存&#xff0c;相应的推理引擎通过读取模型文件并反序列化即可进行推理过程. 这样一来&#…

MongoDB 单节点升级为副本集高可用集群(1主1从1仲裁)

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG、Mongodb数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享…

leetcode力扣_排序问题

215.数组中的第K个最大元素 鉴于已经将之前学的排序算法忘得差不多了&#xff0c;只会一个冒泡排序法了&#xff0c;就写了一个冒牌排序法&#xff0c;将给的数组按照降序排列&#xff0c;然后取nums[k-1]就是题目要求的&#xff0c;但是提交之后对于有的示例显示”超出时间限制…

基于顺序表的通讯录实现

一、前言 基于已经学过的顺序表&#xff0c;可以实现一个简单的通讯录。 二、通讯录相关头文件 //Contact.h #pragma once#define NAME_MAX 20 #define TEL_MAX 20 #define ADDR_MAX 20 #define GENDER_MAX 20typedef struct PersonInfo {char name[NAME_MAX];char gender[G…

pycharm如何使用jupyter

目录 配置jupyter新建jupyter文件别人写的方法&#xff08;在pycharm种安装&#xff0c;在网页中使用&#xff09; pycharm专业版 配置jupyter 在pycharm终端启动一个conda虚拟环境&#xff0c;输入 conda install jupyter会有很多前置包需要安装&#xff1a; 新建jupyter…

VScode将界面语言设置为中文

1. 点击左侧的扩展图标&#xff0c;打开侧边栏“EXTENSIONS”面板。 2. 在搜索框中输入“Chinese”&#xff0c;查找出“中文简体”插件&#xff0c;点击“install”按钮。 3. 等待插件安装完成&#xff0c;点击右下角“restart”按钮&#xff0c;从而重新启动Vscode。