【问题记录】Ubuntu 22.04 环境下,程序报:段错误(核心已转储)怎么使用 core 文件和GDB调试器 解决?

目录

环境

问题情况

解决思路

原因分析

解决方法

番外知识


  • VMware® Workstation 16 Pro (版本:16.1.2 build-17966106)
  • ubuntu-22.04.2-desktop-amd64

  • 本人在运行百万并发的服务端程序时,程序运行报:段错误(核心已转储),导致程序异常退出,如下

  • 首先要确定核心转储文件的生成路径和大小限制。然后使用调试器(如 GDB)来分析核心转储文件和堆栈跟踪信息后,修复代码中导致“段错误”的原因。

1.什么是段错误?

  • 段错误(Segmentation Fault)是一种常见的程序错误,通常在访问无效的内存地址时发生。当程序试图访问一个不属于它的内存段时,操作系统会发送一个信号(SIGSEGV(段错误信号))给程序,称为段错误。

2.可能产生段错误的情况

  • 内存访问错误:最常见的原因之一是程序试图访问无效的内存地址或未初始化的指针。这可能是由于代码错误、缓冲区溢出或内存越界等造成的。当程序尝试访问系统不允许访问的内存区域时,操作系统会引发段错误。
  • 无效的指令或操作:另一个常见原因是程序执行了无效的指令或操作。这可能是由于编译错误、错误的代码逻辑或架构不兼容性等引起的。当处理器尝试执行无效的指令或操作时,会导致段错误。
  • 动态内存分配问题:使用动态内存分配(如 malloc 或 new)时,如果出现内存泄漏、重复释放已释放的内存或访问已释放的内存等问题,可能导致段错误。这些问题可能是由于错误的内存管理导致的。
  • 栈溢出:如果程序的栈空间超出了其允许的范围,例如无限递归调用或大量局部变量使用导致的栈溢出,会产生段错误。
  • 库或依赖项问题:有时,段错误可能是由于使用损坏的库、不兼容的版本或缺少的依赖项引起的。库的错误使用或配置问题可能导致段错误。
  • 硬件问题:虽然比较罕见,但硬件故障(如内存损坏)也可能导致程序报告段错误并生成核心转储。

3.核心已转储是转储到那儿?

  • 当程序发生段错误时,操作系统会生成一个名为 core 或 core.<进程ID> 的核心转储文件,其中包含了程序崩溃时的内存映像和其他相关信息。这个core文件通常会被转储到当前工作目录下。
  • 但我的 core 文件并没有生成到程序的工作目录下,看下面解决...

1.检查操作系统的核心转储文件(core dump file)生成设置

  • 使用命令 ulimit -a 查看当前的核心转储文件大小限制和其他限制信息
  • 查找输出中的"core file size"(核心转储文件大小)字段,红框中的 0 表示当前禁用了核心转储文件的生成。可以更改这个限制来启用核心转储文件的生成。

2.更改 "core file size”字段 的限制来启用核心转储文件的生成

  • 使用 ulimit -c unlimited 命令可以将core文件的大小限制设置为无限制,但通过ulimit命令设置的参数仅在当前 shell 进程生效,也就是当前会话。一旦关闭终端窗口,设置将被重置为默认值。因此,这种修改并不是永久性的。不推荐
  • 如果想要在系统级别永久修改core文件的生成大小限制,需要进行操作系统的配置更改。可以通过修改 /etc/security/limits.conf 文件来设置core文件大小限制。添加或修改下面两行:
    • *    soft    core    unlimited
    • *    hard    core    unlimited
  • 重启虚拟机,重新加载系统的参数配置,以确保更改生效重启命令: sudo reboot

3.话不多说,直接测试一下

  • 不想跑服务端程序了,太费时了,直接写一个测试栗子,代码如下:
  • 运行该测试栗子后,并没有在工程目录下生成 core 文件。

4.确定一下 core 文件的生成路径

  • 查找资料说Linux 内核有一个参数 kernel.core_pattern,用于指定生成核心转储文件时的文件名和路径模式,相关的配置文件为/proc/sys/kernel/core_pattern。而在 Linux 中,可以使用 sysctl 命令来检查和更改核心转储文件的生成路径限制。
  • 然后使用 sysctl kernel.core_pattern 命令来查看当前的核心转储文件生成路径。它输出了下面一行内容:
    • kernel.core_pattern = |/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E
    • 上面这一行是啥意思呢,解释如下:
      • |/usr/share/apport/apport: 它是一个特殊的核心转储处理程序(core dump handler),它是一个用于收集和报告故障的工具。当进程收到 SIGSEGV 或类似的信号时,内核将使用 kernel.core_pattern 中指定的处理程序来处理和处理核心转储文件。
      • %p: 进程 ID。
      • %s: 目前正在运行的线程 ID。
      • %c: 产生核心转储文件的信号代码。
      • %d: 序列号,用于确保在同一目录中生成的核心转储文件具有唯一的名称。
      • %P: 父进程 ID。
      • %u: 用户名。
      • %g: 组名。
      • %E: 产生核心转储文件的可执行文件全路径。
    • 具体而言,/usr/share/apport/apport 是一个用于 Ubuntu 系统的工具,它可以收集有关崩溃和故障的信息,并生成相应的错误报告。

5.修改 core 文件的生成路径

  • 可以使用 sudo sysctl -w kernel.core_pattern=<path_to_directory>/core 命令将其恢复为期望的路径。确保 <path_to_directory> 是一个有效的目录路径。比如
    • sudo sysctl -w kernel.core_pattern=core
  • 重新编译一下,在当前目录下生成了 core.<进程ID> 的核心转储文件,如下
  • 注意:以上方式修改 kernel.core_pattern 的值只在运行时生效,并不是永久的,在系统重启后,该更改将被重置为默认值。
  • 可以了解最后一节“番外知识

6.使用调试工具 gdb 来加载和分析 core 文件

  • 生成核心文件:使用 gcc 编译记得加 -g 命令。
  • 加载核心文件:使用gdb命令行加载核心文件,将核心文件加载到调试环境中。
    • gdb <可执行文件路径> <核心文件路径>
  • 查看堆栈回溯:运行gdb后,使用bt命令(或backtrace)来查看堆栈回溯,它将显示程序在崩溃时的函数调用链。
    • (gdb) bt
  • 检查变量值:你可以使用print命令来检查变量的值。只需指定变量名即可查看其当前值。
    • (gdb) print variable_name
  • 跳转到特定帧:使用frame命令可以在堆栈帧之间进行导航,并查看在特定帧上的堆栈信息。帧编号通常是从0开始按逆序分配的,也就是最底部帧的编号是0。
    • (gdb) frame frame_number
  • 分析原因:分析堆栈回溯和变量值,可以帮助你定位程序崩溃的原因。一般情况下,最底部的堆栈帧提供了最初崩溃的位置。
  • 操作如下:说明 *P 未初始化

番外知识

1.对 /proc/sys/kernel/core_pattern 可以添加可写权限吗?

  • 答案是不可以。默认权限如下(所有者具有读写权限,组用户和其他用户只有读取权限)。
  • 对于/proc/sys/kernel/core_pattern文件,不能直接添加可读权限。这是因为/proc目录和其下的文件是虚拟文件系统(procfs)的一部分,用于提供对内核和进程信息的访问,它们的权限和所有权是由内核控制的,而不受Linux文件系统权限模型的限制。
  • /proc目录中,每个文件和目录的权限通常被设置为只读,不允许用户直接修改它们的权限。这是为了确保提供的信息的完整性和一致性,并防止对内核和进程状态的非授权更改。
  • 因此,无法通过常规的 chmod 命令或其他方式直接向 /proc/sys/kernel/core_pattern添加可读权限或更改其权限。尝试执行类似以下命令时会出现错误:
    • sudo chmod +w /proc/sys/kernel/core_pattern
  • 你会收到“Operation not permitted”或“不允许的操作”类似的错误消息。

2.在系统重启后,对 /proc/sys/kernel/core_pattern 文件的更改为什么被重置为默认值?

  • 这是因为/proc/sys/目录中的文件是在内核启动期间动态生成的,其值来自于内核参数或其他系统设置。在系统重启时,这些文件会重新加载为其默认值或由某些配置文件指定的值。

3.怎么实现永久性修改/proc/sys/kernel/core_pattern 文件呢?(这条有问题)

  • 编辑/etc/sysctl.conf文件:这种方式不太好,每次系统重启后要执行一下 sudo sysctl -p 命令才会修改/proc/sys/kernel/core_pattern的值
    • 可以编辑 /etc/sysctl.conf 文件,将核心转储文件模式的修改添加到该文件中,添加内容如下:
      • kernel.core_pattern = core
    • 在保存并退出文件后,使用以下命令重新加载配置,使新的核心转储文件模式生效:
      • sudo sysctl -p
  • 创建并编辑系统启动脚本:可以编写一个脚本,以在系统启动时将核心转储文件模式设置为所需的值。将脚本放置在适当的位置,例如/etc/init.d/目录,并设置为在系统启动时执行。(测试了没有用)
    • 创建启动脚本文件:在所选择的目录中创建一个新文件
      • sudo vim /etc/init.d/my_startup_script.sh
    • 编写启动脚本:在脚本中添加如下内容,保存成功并退出。
      • #!/bin/bash
      • echo "core" >> /proc/sys/kernel/core_pattern
      • exit 0
    • 赋予脚本执行权限:使用以下命令为启动脚本文件赋予执行权限
      • sudo chmod +x /etc/init.d/my_startup_script.sh
    • 配置启动脚本的执行:将启动脚本添加到系统的启动过程中,以确保在系统启动时执行
      • sudo update-rc.d my_startup_script.sh defaults
    • 若要禁用脚本的启动,可以使用以下命令(了解)
      • sudo update-rc.d -f my_startup_script.sh remove

注意

  • 需要注意的是,更改 /proc/sys/kernel/core_pattern 文件的权限和内容是敏感操作,可能会影响系统的稳定性和安全性。务必小心谨慎,并确保了解所做更改的影响。

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

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

相关文章

VLAN---虚拟局域网

VLAN— 虚拟局域网 LAN—局域网 MAN—城域网 WAN—广域网 1.一个VLAN相当于是一个广播域 VLAN—通过路由器和交换机协同工作后&#xff0c;将原本的一个广播域逻辑上&#xff0c;拆 分为多个虚拟的广播域。 VLAN配置&#xff1a; 1.创建VLAN VID—VLAN ID------用来区分和…

浅谈能源管理系统在水泥行业中设计分析

安科瑞 华楠 摘要&#xff1a;水泥企业作为我国产业结构中重要的耗能产业&#xff0c;同时对环境的污染也比较大&#xff0c;因此在水泥企业中建立能源管理系统&#xff0c;对水泥企业的生产过程过程进行全过程的监控和管理&#xff0c;对于降低企业的能源消耗和提高企业的经济…

【Ajax】笔记-Axios与函数发送AJAX请求

Axios 和 Ajax 的区别 1、Axios是一个基于Promise的HTTP库&#xff0c;而Ajax是对原生XHR的封装&#xff1b; 2、Ajax技术实现了局部数据的刷新&#xff0c;而Axios实现了对ajax的封装。 优缺点&#xff1a; ajax&#xff1a; 本身是针对MVC的编程,不符合现在前端MVVM的浪潮 基…

【MySQL】之复合查询

【MySQL】之复合查询 基本查询多表查询笛卡尔积自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询 合并查询小练习 基本查询 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J按照部门号升序而雇员的工资降序排序使用…

性能测试Ⅱ(压力测试与负载测试详解)

协议 性能理论&#xff1a;并发编程 &#xff0c;系统调度&#xff0c;调度算法 监控 压力测试与负载测试的区别是什么&#xff1f; 负载测试 在被测系统上持续不断的增加压力&#xff0c;直到性能指标(响应时间等)超过预定指标或者某种资源(CPU&内存)使用已达到饱和状…

全志F1C200S嵌入式驱动开发(解决spi加载过慢的问题)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 之前的几个章节当中,我们陆续解决了spi-nor驱动的问题、uboot支持spi-nor的问题。按道理来说,下面要做的应该就是用uboot的loady命令把kernel、dtb、rootfs这些文件下载到ddr,然…

WebRTC Simulcast介绍

原文地址&#x1f447; https://blog.livekit.io/an-introduction-to-webrtc-simulcast-6c5f1f6402eb/ 你想知道的关于Simulcast的一切 Simulcast是WebRTC中最酷的功能之一,它允许WebRTC会议在参与者网络连接不可预测的情况下进行扩展。在这篇文章中,我们将深入探讨Simulcas…

欧姆龙CX系列PLC串口转以太网欧姆龙cp1hplc以太网连接电脑

你是否还在为工厂设备信息采集困难而烦恼&#xff1f;捷米特JM-ETH-CX转以太网通讯处理器为你解决这个问题&#xff01; 捷米特JM-ETH-CX转以太网通讯处理器专门为满足工厂设备信息化需求而设计&#xff0c;可以用于欧姆龙多个系列PLC的太网数据采集&#xff0c;非常方便构建生…

4、非线性数据结构

上一节课我们讲了线性数据结构&#xff0c;这一节我们说下非线性数据结构。 非线性数据结构&#xff0c;从字面意思来看&#xff0c;就是指不是线性的结构。线性结构的特点是只有一个前驱和一个后继。 那么非线性结构的特点就是有多个前驱或后继了。 如果只存在一个没有前驱的…

ChatGPT是什么?ChatGPT里的G、P、T分别指什么

前言 ChatGPT是一种基于人工智能技术的聊天机器人&#xff0c;它可以模拟人们的对话方式进行自然语言交流&#xff0c;并根据用户提出的问题、需求、意愿等信息提供相关服务或回答问题。 ChatGPT的G、P、T分别指“生成式”&#xff08;Generative&#xff09;、“预训练”&…

买卖股票的最佳时机系列

//方法一 class Solution { public:int dp[100005];int maxProfit(vector<int>& prices) {//dp[i]表示前i天买入卖出的获取的最大利润//min_val表示前i-1天买入的最小值&#xff1b;dp[0]0;int min_valprices[0];for(int i1;i<prices.size();i){dp[i]max(dp[i-1],…

HikariCP连接池

HikariCP连接池 HikariCP连接池是高性能的JDBC连接池&#xff0c;官网标注的三大特点&#xff1a;快速、简单、可靠&#xff0c;性能优于其他连接池。 官网详细地说明了HikariCP所做的一些优化&#xff0c;总结如下&#xff1a; 字节码精简&#xff1a;优化代码&#xff0c;直…

Jsonp劫持

JSONP 介绍 jsonp是一种协议&#xff0c;准确的说&#xff0c;他是json的一种使用模式&#xff0c;为了解决Json受同源策略限制的问题。 基本语法 JSONP的基本语法为&#xff1a;callback({“name”:”test”, “msg”:”success”}) 常见的例子包括函数调用&#xff08;如…

mac怎么转换音频格式?

mac怎么转换音频格式&#xff1f;相信很多小伙伴都知道&#xff0c;平时我们接触到的音频格式大多是mp3格式的&#xff0c;因为mp3是电脑上最为流行的音频格式&#xff0c;不过除了mp3格式外&#xff0c;还有很多不同的音频格式&#xff0c;有时候不同网上或者不同软件上下载到…

Java开发中的分层开发和整洁架构

分层开发(横向拆分) 分层开发的概念: maven多模块开发项目管理.可以利用这种管理功能,实现一个项目的多层次模块开发–分层开发. 比如,当前项目HelloController依赖HelloService 这样做目的: 复杂开发过程.解耦(不调整依赖关系,无法解耦).分层开发(横向拆分)和纵向拆分的区别…

麒麟v10-coredns 启动失败

现象 在麒麟ARM芯片的机器上搭建k8s&#xff0c;其中的的一个组件cordons 发现启动失败&#xff0c;查看日志如下所示&#xff1a;No such device or address 问题分析 期初猜测kubelet与containerd的cgroupDriver驱动不一致导致。分别查看是一致的。没有问题。发现系统存在…

leetcode 1870. Minimum Speed to Arrive on Time(准时到达的最小速度)

需要找一个speed, 使得dist[i] / speed 加起来的时间 < hour, 而且如果前一个dist[i] / speed求出来的是小数&#xff0c;必须等到下一个整数时间才计算下一个。 speed最大不会超过107. 不存在speed满足条件时返回-1. 思路&#xff1a; 如果前一个dist[i] / speed求出来的…

vue-element-template管理模板(二)

vue-element-admin框架 动态路由&#xff08;二&#xff09; 修改代码&#xff1a; import { asyncRoutes, constantRoutes } from "/router"; import { getMenu } from "/api/user"; import Layout from "/layout";/*** Use meta.role to det…

C++第三方开发库matplotlib-cpp

Matplotlib-cpp是一个用于在C中绘制图表的开源库。它提供了与Python的Matplotlib库类似的功能&#xff0c;使得在C环境下进行数据可视化变得更加便捷。基于Matplotlib-cpp&#xff0c;我们可以使用各种绘图函数和样式选项来创建各种类型的图表&#xff0c;包括折线图、散点图、…