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

news/2024/11/23 5:09:43/

参考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.ppmy.cn/news/1006055.html

相关文章

MySQL中的MVCC具体指的是什么?

在MySQL中,MVCC是指多版本并发控制(Multi-Version Concurrency Control)。它是一种用于处理并发读写操作的数据库事务管理技术。 MVCC通过在数据库中维护多个版本的数据来实现并发控制,每个事务在执行期间看到的数据版本是确定性…

性能监控-influxDB数据库

InfluxDB 是 Go 语言编写的时间序列数据库,用于处理海量写入与负载查询。涉及大量时间戳数据的任何用例(包括 DevOps 监控、应用程序指标等)。我认为 InfluxDB 最大的特点在于可以按照时间序列面对海量数据时候的高性能读写能力,非…

科技的成就(四十九)

381、机器人 Unimate 诞生 "1961 年,第一款工业机器人 Unimate 诞生。工程师恩格尔伯格受阿西莫夫小说《我,机器人》影响,与发明家德沃尔成立了 Unimation。1961 年,公司的第一台机器 人 Unimate 开始在通用电气新泽西工厂试…

剑指Offer 58.左旋转字符串

58.左旋转字符串 目录 58.左旋转字符串题目代码(字符串拼接)利用切片函数同余简化代码利用StringBuilder 面试:StringBuilder与String的使用比较 题目 官网地址 代码(字符串拼接) class Solution {public String r…

【Ubuntu】Ubuntu 22.04 升级 OpenSSH 9.3p2 修复CVE-2023-38408

升级原因 近日Openssh暴露出一个安全漏洞CVE-2023-38408,以下是相关资讯: 一、漏洞详情 OpenSSH是一个用于安全远程登录和文件传输的开源软件套件。它提供了一系列的客户端和服务器程序,包括 ssh、scp、sftp等,用于在网络上进行…

【2023.8】docker一键部署wvp-GB28181-pro和ZLMediaKit过程全记录

安装docker 使用的操作系统是ubuntu20.04 如何在 Ubuntu 20.04 上安装和使用 Docker https://developer.aliyun.com/article/762674 docker拉取配置好的ZLMediaKIt和wvp-GB28181-pro docker pull 648540858/wvp_pro第一次运行 docker一键运行ZLMediaKIt和wvp-GB28181-pro …

腾讯云国际轻量应用服务器怎么使用呢?

腾讯云国际轻量应用服务器怎么使用呢?下面一起来了解一下: 1. 熟悉轻量应用服务器基础知识 ①什么是轻量应用服务器 TencentCloud Lighthouse? ②轻量应用服务器与云服务器 CVM 的区别是什么? ③为什么选择轻量应用服务器&#xf…

原型链污染例题复现

一、什么是原型链 下面我们通过这个小例子来看看。 可以看到b在实例化为test对象以后,就可以输出test类中的属性a了。这是因为在于js中的一个重要的概念:继承。而继承的整个过程就称为该类的原型链。 在javascript中,每个对象的都有一个指向他的原型(p…