当前位置: 首页 > news >正文

记录一次Linux环境下遇到“段错误核心已转储”然后利用core文件解决问题的过程

参考Linux 下Coredump分析与配置

在做项目的时候,很容易遇到“段错误(核心已转储)”的问题。如果是语法错误还可以很快排查出来问题,但是碰到coredump就没办法直接找到问题,可以通过设置core文件来查找问题,直接定位到出问题的行号,十分方便。

什么是coredump

Core是内存的意思,当程序运行过程中检测到异常程序异常退出的时候,系统就会把程序当前的内存状况存储在一个core文件中,叫做coredumoed也就是信息转储,操作系统检测到当前进程异常时将通过信号的方式通知目标进程相应的错误信息比如我遇到的问题就是SIGSEGV信号(进程进行了一次无效的内存引用,不正确的内存处理)

配置core

  1. 在跟目录下面建立一个储存coredump文件的文件夹(最好是在根目录下面,不然有可能之后会有权限不够的问题)
mkdir /corefile
  1. 设置产生coredump文件的大小
  • 首先使用ulimit -a查看,core file是0的话这个时候就没有办法写core文件,所以要先设置大小
  • 早corefile文件中输入ulimit -c unlimited,设置大小之后最好不要关闭当前窗口,不然打开新窗口的时候core文件大小可能又变成0了
  • 执行以下两条命令:
echo "1" > /proc/sys/kernel/core_uses_pid //将1写入到该文件里
echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
  • 修改配置文件
vim /etc/profile

添加ulimit -S -c unlimited > /dev/null 2>&1
执行命令使其生效

source /etc/profile
  • 机器重启的时候清空corefile
    因为coredump文件很大会占用硬盘,所以在配置文件/etc/rc.local中最后面添加命令rm -rf /corefile/*,机器重启的时候清空这个文件夹
  • 再执行以下两条命令
 echo "1" > /proc/sys/kernel/core_uses_pid echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

测试

  • 在编译程序或者项目的时候,一定要加上-g,不然之后通过gdb查看问题的时候不会显示出错的地方的行号
  • 运行程序,出现“段错误核心已转储”,然后去corefile文件,命令行输入ll,出现如下结果
    在这里插入图片描述
  • 运行gdb阅读core文件
gdb 程序路径 对应的coredump文件
  • 如果命令输入不正确就会显示如下图
    gdb运行的时候没有输入这个程序路径:
    在这里插入图片描述
    编译的时候没有加参数-g:
    在这里插入图片描述
  • gdb运行成功:会显示出问题的行号,通过bt或者where看到函数调用栈情况

经过问题排查,发现我是因为错误使用内存,所以编写代码的时候要注意细节,如果出现问题要擅长通过gdb调试、core文件排查、解决问题。

http://www.lryc.cn/news/109790.html

相关文章:

  • WPF中自定义Loading图
  • 用html+javascript打造公文一键排版系统14:为半角和全角字符相互转换功能增加英文字母、阿拉伯数字、标点符号、空格选项
  • 叮咚买菜财报分析:叮咚买菜第二季度财报将低于市场预期
  • 设计模式行为型——中介者模式
  • Vue——formcreate表单设计器自定义组件实现(二)
  • 人脸验证(Face verification) 和 人脸识别(Face recognition) 的区别
  • 前端如何打开钉钉(如何唤起注册表中路径与软件路径不关联的软件)
  • 数据可视化入门指南
  • React 18 响应事件
  • 面试总结-c++
  • Spring(九) - 解惑 spring 嵌套事务.2
  • Android Studio API 33 获取当前连接的WIFI名称
  • ICCV 2023 | 半监督三维目标检测新SOTA:密集匹配和量化补偿
  • python+django+mysql项目实践三(用户管理)
  • Java多线程 | 操作线程的方法详解
  • 【ConcurrentHashMap1.7源码】十分钟带你深入ConcurrentHashMap并发解析
  • 程序框架-事件中心模块-观察者模式
  • 通过AOP的ProceedingJoinPoint获取方法信息
  • 【JavaSE】初步认识类和对象
  • python中的matplotlib画饼图(数据分析与可视化)
  • 用Rust实现23种设计模式之 职责链模式
  • 进销存管理中的技术创新和数字化转型
  • 与“云”共舞,联想凌拓的新科技与新突破
  • 【超细节】Vue3组件事件怎么声明,defineEmits与emit
  • java Selenium 实现简单的网页操作
  • (数据库系统概论|王珊)第一章绪论-第一节:数据库系统概论
  • 深入理解TCP三次握手:连接可靠性与安全风险
  • 基于人工智能的智能矿山解决方案
  • vue-cli3项目优化
  • Windows环境下VSCode安装PlatformIO Cero报错ERROR: HTTP error 403 while getting