【linux】coredump问题排查

news2024/9/20 15:21:20

 

序言

  • 记录coredump问题的一些定位技巧

1. coredump简介

  • coredump称为核心转储,就是在进程异常时的一个快照,保存了异常时的内存、寄存器、堆栈等数据
  • 当进程接收到某些 信号 而导致异常退出时,就会生成 coredump 文件
  • core文件是ELF文件格式,可通过readelf读取查看其信息

2. 常见的coredump错误

2.1 哪些信号会导致coredump

2.1 coredump的常见原因

2.2.1 非法指针
  • 使用空指针:指针为空,但仍然访问其成员;或指针已经释放又再次直接访问
  • 对未初始化的指针进行了操作
  • 内存double free:多次释放同一段内存
  • 随意使用指针转换:一个指向一段内存的指针,可能这段内存的开始地址就是按照某种结构或者类型对齐的,如果随意进行指针类型转换,可能导致bus error或coredump
  • 存在野指针:内存释放后,指针为赋值为nulptr。这个原因只是我个人猜想
2.2.2 内存越界访问
  • 数组下标越界:比如未检查传参元素个数,下标超了max_size
  • 搜索字符串时以字符串结束符作为判断条件,但字符串可能没有正常使用结束符
  • 使用了非安全的字符串操作函数:如使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等安全函数防止读写越界
2.2.3 多线程原因
  • 多线程使用了线程不安全函数:应使用可重入函数asctime_r(3c) gethostbyname_r(3n) getservbyname_r(3n) ctermid_r(3s) gethostent_r(3n) getservbyport_r(3n) ctime_r(3c) getlogin_r(3c) getservent_r(3n) fgetgrent_r(3c) getnetbyaddr_r(3n) getspent_r(3c) fgetpwent_r(3c) getnetbyname_r(3n) getspnam_r(3c) fgetspent_r(3c) getnetent_r(3n) gmtime_r(3c) gamma_r(3m) getnetgrent_r(3n) lgamma_r(3m) getauclassent_r(3) getprotobyname_r(3n) localtime_r(3c) getauclassnam_r(3) etprotobynumber_r(3n) nis_sperror_r(3n) getauevent_r(3) getprotoent_r(3n) rand_r(3c) getauevnam_r(3) getpwent_r(3c) readdir_r(3c) getauevnum_r(3) getpwnam_r(3c) strtok_r(3c) getgrent_r(3c) getpwuid_r(3c) tmpnam_r(3s) getgrgid_r(3c) getrpcbyname_r(3n) ttyname_r(3c) getgrnam_r(3c) getrpcbynumber_r(3n) gethostbyaddr_r(3n) getrpcent_r(3n)等
  • 多线程读写的数据未加保护:会被多个线程同时访问的全局数据应该加保护,否则很容易导致coredump;
2.2.4 堆栈溢出
  • 不要使用太大的局部变量,容易造成堆栈溢出,导致一些奇怪的错误
2.2.5 字节对齐原因

看到有的文章列的原因,目前没有碰到过

  • 字节对齐方式引起的程序核心转储
  • 引用模块与自身模块所定义的结构体的字节对齐方式不同
  • 在代码中, 把引用到的别的模块的头文件包含到自身文件中的字节对齐方式语法声明的中间了, 结果导致字节对齐方式出现了变化

3. 如何生成coredump文件

  • 为了生成coredump文件,编译选项中需要添加-g选项

  • 添加-g后可使用gdb调试,调用栈也能显示行号

3.1 先看系统是否允许生成coredump文件

ulimit -c
  • 0:表示禁止产生coredump文件
  • unlimited: 表示不限制coredump文件的大小
  • 1024: 表示coredump文件大小不能超过1024K

3.2 设置允许coredump文件生成

3.2.1 设置当前会话生效
ulimit -c 1024		// 或其他数值/unlimited
3.2.2 设置对当前用户生效
  • 在~/.bashrc或者~/.bash_profile中进行配置
ulimit -c unlimited
3.2.3 设置系统生效
  • 在/etc/security/limits.conf文件中进行配置

  • vim /etc/security/limits.conf

  • 配置如下字段:

    <domain><type><item><value>
    *softcoreunlimited

3.3 设置coredump文件的存储位置

  • 先看默认配置:cat /proc/sys/kernel/core_pattern
3.3.1 修改方式1
echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
  • 将会在/corefile目录下生成e-线程名-p-进程号-t时间戳的core文件
3.3.2 修改方式2
sysctl -w kernel.core_pattern=/corefile/core-%e-%p-%t
3.3.3 修改方式3:对系统生效
  • 在/etc/sysctl.conf中添加配置

    kernel.core_uses_pid = 1
    kernel.core_pattern = /your/own/path/core_%e_%p_%t
    
  • 然后执行:

    sysctl -p
    
  • 查看cat /proc/sys/kernel/core_pattern如果设置未生效则可在目标目录如corefile下执行sysctl -p或者重启电脑后执行sysctl -p

【参数含义】

%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
  • 注:vscode调试时发生coredump后右键选择copy call stack也可以保存

4. 如何排查coredump问题

4.1 问题能复现

4.1.1 debug模式下gdb运行
  • debug模式下使用,即编译选项加-g

    gdb 可执行文件
    r	# 运行
    bt	# 查看调用栈
    
  • bt或where查看调用栈

  • 如果是多线程可通过如下命令查看每个线程的调用栈情况

    info thread				# 查看所有线程
    thread apply all bt		# 查看所有线程的调用栈情况
    
  • gdb常用命令汇总

4.1.2 coredump发生时记录core文件
  • 按照3中的流程打开core文件设置,使程序能在coredump文件发生时记录core文件

  • 但要防止core文件过大,需要定期清理

  • 拿到core文件后执行如下语句复现问题

    gdb executable_file core_file
    
4.1.3 log辅助定位
  • 使用glog打印,节点运行过程中记录log,节点掉线保存log过后查看日志信息
  • 一种方法是使用glog日志框架添加和保存日志;
  • 一种是比较简单的std::cout/printf添加日志并:executable_file > log.txt 2>&1保存为文件查看

【本地复现】

  • 本地gdb executable_file长时播包测试直到问题复现

  • 最好也设置core文件存储,否则因为其他原因导致系统死机无法查看现场

4.2 问题不能复现

  • 考虑到2中描述的coredump可能的原因,如果不能复现,可以做一些排查工作

  • 此外,无法复现的coredump问题应该这样跟踪

4.2.1 代码review
  • 确认问题引入的时间段,针对性的进行代码review找出可能导致coredump的原因
  • 但是当问题引入时间不明确,或者代码特别多的时候,这种方法可能不太实用
4.2.2 使用valgrind查内存问题
  • valgrind简单使用指导

  • valgrind -v ./executable_file然后直接查看ERROR SUMMARY

4.2.3 针对常见coredump问题原因进行排查
  • 是否有空指针未判空访问
  • 是否有内存泄漏或者内存double free等
  • 是否有数组越界访问
  • 是否多线程全局变量未加保护访问

4.3 容器创建时设置core文件存储

  • 容器内启动的程序,可在容器创建时设置core文件存储,设置方式见3.3章节

  • 通过设置Dockerfile中CMDENTRYPOINT命令来设置,dockerfile创建镜像命令

    • CMD:容器启动时执行的命令,这些命令在docker run时执行
    • ENTRYPOINT:容器启动时执行的命令,与CMD类似
    • CMD会被docker run时添加的参数覆盖,ENTRYPOINT不会被覆盖
  • 可设置自动设置脚本setenv.sh如下

    #! /bin/bash
    sysctl -w kernel.core_pattern=/corefile/core-%e-%p-%t
    sysctl -p
    
  • 修改文件权限

    chmod 777 setenv.sh
    
  • 然后Dockerfile中添加

    CMD ["./setenv.sh"]
    

【参考文章】
如何配置生效core文件
配置生效core文件和压缩coredump文件
coredump问题排查方法
coredump常见原因1
coredump常见原因2
coredump常见原因3
coredump文件是如何产生的 (推荐)
除gdb外的其他定位coredump方法

created by shuaixio, 2022.11.20

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

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

相关文章

docker-compose 安装 Prometheus + Grafana 配置监控页面

安装 Prometheus Grafana docker 编排 prometheus:image: prom/prometheus:v2.40.1container_name: prometheusports:- "9090:9090"volumes:- /docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.ymlnetwork_mode: "host"grafana:image: gra…

【Linux】基础:进程控制

【Linux】基础&#xff1a;进程控制 摘要&#xff1a;本文主要介绍关于Linux进程控制内容&#xff0c;分为创建、退出、等待与替换四个板块&#xff0c;希望读者可以掌握每个板块的主要概念以及使用原因和调用方法。 文章目录【Linux】基础&#xff1a;进程控制一、进程创建1.1…

Nginx重定向

Rewrite简介 Rewrite是Nginx服务器提供的一个重要基本功能&#xff0c;是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。 注意:Nginx服务器的Rewrite功能的实现依赖于PCRE的支持&#xff0c;因此在编译安装Nginx服务器之前&#xff0c;需要安装PCRE库。Ngin…

(续)SSM整合之springmvc笔记(SpringMVC处理ajax请求)(P154-158)

目录 SpringMVC处理ajax请求 一 准备工作 1 新建spring_mvc_ajax com.atguigu 2 .导入依赖 3 添加web模块 4 .配置web.xml 5 . springmvc.xml 6 .创建控制层 7 . index.html 8 静态 9 部暑到tomcat上 10 启动tomcat 二 . 测试SpringMVC处理ajax 1 . ind…

TCP三次握手与四次挥手详解

TCP三次握手(建立TCP连接): 建立TCP连接&#xff0c;就是指建立一个TCP连接时&#xff0c;需要客户端和服务总共发送3个包以确认连接的建立。在socket编程中&#xff0c;这一过程由客户端执行connect来触发。 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连…

GSN前瞻预处理

在数控加工等应用中&#xff0c;要求数控系统对机床进行平滑的控制&#xff0c;以防止较大的冲击影响零件的加工质量。 运动控制器的前瞻预处理功能可以根据用户的运动路径计算出平滑的速度规划&#xff0c;减少机床的冲击&#xff0c;从而提高加工精度。 下面用一个实例来说明…

一文了解Spring MVC(上)

目录 什么是Spring MVC 什么是MVC Spring MVC 和MVC的区别 怎么学Spring MVC Spring MVC的创建和连接 RequestMapping注解 获取参数 传递基础数据类型/包装类型&#xff08;无注解&#xff09; 添加RequestParam注解&#xff08;使用在方法参数上&#xff09; 传递自…

python——GIL锁详解

文章目录一、GIL全局解释器锁二、为什么会有GIL锁&#xff1f;三、多线程无法利用多核优势&#xff1f;计算密集型和IO密集型计算密集型——采用多进程计算密集型——采用多线程IO密集型——采用多进程IO密集型——采用多线程四、总结一、GIL全局解释器锁 1、GIL锁不是python的…

C语言 数据的存储

C语言 数据的存储一、数据与进制之间的关系1. 十进制与二进制之间的转换2. 二进制与十六进制之间的转换二、整型数据存储1. 原、反、补码2. 整型数据在内存中的存储3. 为什么整型数据存在内存中存储的是补码4. 有符号和无符号的数据类型有符号和无符号的存储范围猜想5. 关于 ch…

Java项目:SSH企业人力资源管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 企业人力资源管理系统&#xff0c;分为超级管理员与普通管理员两种角色,超级管理员可以对普通管理员进行添加、删除等操作&#xff1b; 超级管理…

【k8s】1、基础概念和架构及组件

文章目录一、kubernetes概述1、什么是kubernetes&#xff1f;2、应用程序部署方式的演变3、为什么要用kubernetes&#xff1f;二、kubernetes 特性三、Kubernetes集群架构与核心组件1、master组件1.1 kube-apiserver&#xff08;中央枢纽&#xff09;1.2 kube-controller-manag…

股价下跌18%后,满帮集团(YMM)的财务业绩正在加速放缓

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 市场与竞争 根据Beroe Advantage Procuremen的一份市场研究报告&#xff0c;2020年中国道路运输服务市场的规模估计为250亿美元。 这意味着这个行业近年来的复合年增长率为6.5%。 物流参与者往往集中在中国的西南和中南部地…

.NET跨平台框架选择之一 - Avalonia UI

1. Avalonia UI简介 Avalonia UI文档教程&#xff1a;https://docs.avaloniaui.net/docs/getting-started 随着跨平台越来越流行&#xff0c;.NET支持跨平台至今也有十几年的光景了(Mono开始)。 但是目前基于.NET的跨平台&#xff0c;大多数还是在使用B/S架构的跨平台上&…

数据分析面试重点

2022年10月求职季&#xff0c;疫情的影响&#xff0c;但是也挡不住各位小伙伴&#xff0c;找工作的热情。目前&#xff0c;数据分析行业大火&#xff0c;相信很多小伙伴都想去这一行业试试水。想要成功进入数据分析行业&#xff0c;就必须得通过数据分析面试&#xff0c;面试的…

计控实验(二)——积分分离PID控制实验

太原理工大学计算机控制技术实验之积分分离PID控制实验 积分分离PID控制实验实验原理实验内容实验结果思考题实验原理 上图是一个典型的PID 闭环控制系统方框图&#xff0c;其硬件电路原理及接线图可设计如下&#xff0c;图中画“○”的线需用户在实验中自行接好&#xff0c;对…

跟艾文学编程《Python基础》PyCharm 安装

作者&#xff1a;艾文&#xff0c;计算机硕士学位&#xff0c;企业内训讲师和金牌面试官&#xff0c;公司资深算法专家&#xff0c;现就职BAT一线大厂。 邮箱&#xff1a;1121025745qq.com 博客&#xff1a;https://edu.csdn.net/lecturer/894?spm1003.2001.3001.4144 内容&am…

[附源码]java毕业设计文具销售系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

6、子查询 、having、(not) exists、表中增加一列并补充数据、删除表中对应的数据-mysql

目录子查询一、需求分析与问题解决1、实际问题2、子查询的基本使用3、子查询的分类二、单行子查询1、单行比较操作符2、 代码示例3、HAVING 中的子查询4、CASE中的子查询5、 子查询中的空值问题6、 非法使用子查询三、多行子查询1、多行比较操作符2、代码示例3、空值问题四、 相…

《Flowable流程引擎从零到壹》Flowable流程引擎介绍和实战项目初始化流程引擎实例

14天学习训练营导师课程&#xff1a; 邓澎波《Flowable流程引擎-基础篇【2022版】》 邓澎波《Flowable流程引擎-高级篇【2022版】》 学习笔记《Flowable流程引擎从零到壹》回城传送 ❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。Java领域优质创…

mysql中的这些日志,你都知道吗?

在使用mysql的过程中&#xff0c;经常会听到mysql具有数据恢复能力&#xff0c;当我们在业务开发中误删了某些数据后&#xff0c;可以将数据库恢复到误删之前的状态。同时还具有故障恢复能力&#xff0c;当数据库所在的机器突然掉电停机后&#xff0c;mysql也可以保证数据一致性…