【linux】coredump问题排查

article/2025/10/23 13:28:13

 

序言

  • 记录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://chatgpt.dhexx.cn/article/sme03iuJ.shtml

相关文章

Core Dump核心转储

核心转储&#xff08;core dump&#xff09;&#xff0c;在汉语中有时戏称为吐核&#xff0c;是操作系统在进程收到某些信号而终止运行时&#xff0c;将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。这种信息往往用于调试。 概述 编辑 在UNIX系统中…

coredump文件的生成以及如何调试coredump文件?

生成coredump文件的相关配置 1. 首先通过 ulimit -a 命令&#xff0c;查看是否允许coredump文件生成; 如下图所示&#xff0c;core文件大小限制为0&#xff0c;即&#xff1a;不允许core文件生成 2. 使用 ulimit -c [kbytes] 命令更改core文件大小的限制 或者 通过 ulimit -c…

android生成coredump,详解coredump--全面

From: http://blog.csdn.net/tenfyguo/article/details/8159176 一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条…

coredump文件是如何生成的

目录 一、coredump 文件生成过程 二、coredump文件生成原理 1. 信号处理 do_signal() 2. 生成 coredump 文件 三、生产环境应该打开 coredump 功能吗&#xff1f; 人都会犯错&#xff0c;所以在编写程序时难免会出现 BUG。 有些 BUG 是业务逻辑上的错误导致的&#xff0c…

Coredump 详解

引言 当程序运行的过程中异常终止或崩溃&#xff0c;操作系统会将程序当时的内存状态记录下来&#xff0c;保存在一个文件中&#xff08;core文件&#xff09;&#xff0c;这种行为就叫做 Core Dump 或者叫做 ‘核心转储’&#xff0c;利用 coredump 可以帮助我们快速定位程序…

CoreDump追踪

当程序运行的过程中异常终止或崩溃&#xff0c;操作系统会将程序当时的内存状态记录下来&#xff0c;保存在一个文件中&#xff0c;这种行为就叫做Core Dump&#xff08;中文有的翻译成“核心转储”)。我们可以认为 core dump是“内存快照”&#xff0c;但实际上&#xff0c;除…

coredump详解

原文地址&#xff1a;https://blog.51cto.com/u_15471709/4868198 一&#xff0c;什么是coredump 我们经常听到大家说到程序core掉了&#xff0c;需要定位解决&#xff0c;这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止&#xff0c;并且在满…

linux之fping命令

fping检测主机是否存在,fping命令 fping类似于ping&#xff0c;但比ping强大。与ping要等待某一主机连接超时或发回反馈信息不同&#xff0c;fping给一个主机发送完数据包后&#xff0c;马上给下一个主机发送数据包&#xff0c;实现多主机同时ping&#xff0c;fping还可以在命令…

linux fping参数,linux下,fping命令与ping命令解析

ping Linux系统的ping命令是常用的网络命令&#xff0c;它通常用来测试与目标主机的连通性。 1.命令格式&#xff1a; ping [参数] [主机名或IP地址] 2.命令功能&#xff1a; ping命令用于&#xff1a;确定网络和各外部主机的状态&#xff1b;跟踪和隔离硬件和软件问题&#xf…

php fping,【Linux 命令】fping ping 包间隔时间详解

服务器间检查会用到fping的命令,期间遇到了一个问题,需要将ping包间的间隔时间设置为100毫秒,查看fping -h看下,找到了-i和-p两个参数: 看到这两个参数,我当时的表情是这样的: 看不懂,那就测吧: 先来-i: 间隔1s,没有生效.! 再试试-p OK,这个生效了,但-i 和-p的区别是…

fping使用

【-4】-ipv4仅PING IPv4地址 【-6】-ipv6仅PING IPv6地址 【-b】 指定数据&#xff0c;以字节发送&#xff08;默认值&#xff1a;56&#xff09; 【-c】指定发送的数量 【-f】读取一个文件里面的ip 【-g】扫描一个c段 【--ttl】设置ttl值 当这是为ttl1时&#xff0c;未检测到1…

linux yum fping,ping fping

通过ping来监测对端网络状态 ping fpinf在windows和linux上的参数是不同的&#xff0c;返回的结果也是不同的 在网络连通性监测方面用的比较多&#xff0c;在py go中调用命令&#xff0c;对返回的结果使用正则来在文本中挑出所需要的数据信息 windows中的ping参数 fping fping只…

【kali-2021.1】FPING—参数中文版(上)

目录 FPINGFPING是什么命令格式Fping用法选项介绍中文版示例1.不带选项2.设置数据包大小&#xff08;1&#xff09;默认情况下&#xff08;2&#xff09;在使用-b参数情况下 3.指定发送ping次数4.通过IP或DNS返回主机名5.通过文件获取目标6.一次ping多个目标7.设置TTL值8.指定网…

入侵检测——fping(扫描篇)

目录 环境介绍参数数据包参照组数据包&#xff08;使用ping命令&#xff09;windows下使用cmd发出的ping包kali在终端中发出的ping包 fping发出的数据包单个主机扫描&#xff08;无回应&#xff09;单个主机扫描&#xff08;有回应&#xff09;网段扫描 规则 环境介绍 NAT模式…

Linux C/C++ fping命令(检查主机是否存在)

ping基本上是验证网络连接的最简单工具。我们可以验证专用或公共网络中任意两个设备之间的连接。但是今天我们要讲的是fping&#xff0c;因为fping是一个类似ping的程序&#xff0c;它使用Internet控制消息协议&#xff08;ICMP&#xff09;回显请求来确定目标主机是否正在响应…

DeepLabV1网络简析

原论文名称&#xff1a;Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs 论文下载地址&#xff1a;https://arxiv.org/abs/1412.7062 参考源码&#xff1a;https://github.com/TheLegendAli/DeepLab-Context 讲解视频&#xff1a; https:…

DeepLab v3+原理和实现

这节课讲DeepLabv3模型&#xff0c;及前身DeepLabv3模型&#xff0c;两篇论文来自Google的同一个团队。 参考资料 DeepLabv3&#xff0c;被引1000 DeepLabv3&#xff0c;被引1000 Pytorch DeepLabv3实现&#xff0c;Star 1.5k 我们讲1.模型原理2.代码实现 from PIL import Im…

deeplabcut使用

cuda11.2和cudnn8.1安装 win 最新的 Win11/WIN10 安装CUDA11.2和cuDNNlinux ubuntu 16.04 安装 cuda11.2 和cudnn8.2.1 dlc安装 创建虚拟环境 安装deeplabcut2.2.3 tensorflow2.11.0 wxPython4.0.4 pip install deeplabcut2.2.3 deeplabcut里面包含了tensorflow的不用再安…

MATLAB与深度学习(一)— Deep Learning Toolbox

MATLAB与深度学习&#xff08;一&#xff09;— Deep Learning Toolbox 最近&#xff0c;我在学习基于matlab的深度学习的内容&#xff0c;并整理出如下学习笔记。本文借鉴和引用了网上许多前辈的经验和代码&#xff0c;如有冒犯&#xff0c;请及时与我联系。 1. MATLAB与深度…

Deeplab V1 和 V2讲解

Deeplab V1 Background&#xff1a; CNN的一个特性是invariance&#xff08;不变性&#xff09;&#xff0c;这个特性使得它在high-level的计算机视觉任务比如classification中&#xff0c;取得很好的效果。但是在semantic segmentation任务中&#xff0c;这个特性反而是个障…