Core Dump流程分析
闲话
最近分析问题时,发现我的环境中,经常有用户态进程异常退出,但是却没有core文件生成,简单看了一下相关的内核流程,mark一下。
Core Dump基本原理
当应用程序在用户态发生异常时,比如常见的段错误,通常会生成core文件,通过gdb分析core文件,基本就能定位问题。
core文件实际是当前进程地址空间的一个镜像文件,其中包含了该进程在内存中的所有信息。
Linux系统中,Core Dump的主要流程描述为:
- 进程运行过程中出现异常(比如段错误),该异常为硬件上报,可理解为一个中断,异常上报后,CPU在执行完当前的指令后会立刻停止执行当前上下文中的指令,而进入异常处理流程:常规的保存上下文,跳转到相应的中断向量处执行等,具体不详述了。
- 进入异常处理流程后,会判断发生异常的CPU模式(X86中对应相应的Ring),如果发生异常时,处于用户态,则说明该异常只会影响当前进程,于是向用户态进程发送相应的信号,如果是段错误,发送的信号为SIGSEGV,如果为Aborts,通常发送的信号为SIGBUS。如果发生异常时处于内核态,则说明该异常对系统是致命的,则会进入内核die流程,最终会panic,这种情况不会生成core文件,不是这里讨论的重点。
- 当用户态进程有处理信号的时机时(比如得到调度),其会检查pending的信号,然后进行处理,如果发现pending的信号为
SIG_KERNEL_COREDUMP_MASK
中的一个,则会进入core文件搜集流程,最终根据用户配置生成core文件。
代码分析
这里以ARM64架构中,非对齐异常的流程来说明core dump的流程。
信号发送
当硬件检测到alignment fault时,会进入相应的异常处理函数(其他文章已经分析过ARM64的异常处理流程了,可以参考)处理,对于alignment fault,最终会进入do_mem_abort()
函数:
/** Dispatch a data abort to the relevant handler.*/
asmlinkage void __exception do_mem_abort(unsigned long addr, unsigned int esr,struct pt_regs *regs)
{/*从ESR中提取fault信息*/const struct fault_info *inf = fault_info + (esr & 63);struct siginfo info;if (!inf->fn(addr, esr, regs))return;/*我们在messages中看到的打印*/pr_alert("Unhandled fault: %s (0x%08x) at 0x%016lx\n",inf->name, esr, addr);/*填充信号信息*/info.si_signo = inf->sig;info.si_errno = 0;info.si_code = inf->code;info.si_addr = (void __user *)addr;/*通知用户态程序或者是内核die*/arm64_notify_die("", regs, &info, esr);
}
这里的填充的信号是来自ESR,对于alignment fault,默认为SIGBUS信号,然后还是进入了arm64_notify_die()
:
void arm64_notify_die(const char str, struct pt_regs *regs, struct siginfo *info, int err) { /如果发生异常的上下文处于用户态,则给相应的用户态进程发送信号/ if (user_mode(regs)) { current->thread.fault_address = 0; current->thread.fault_code = err; force_sig_info(info->si_signo, info, current); } else { /如果是内核态,则直接die,最终会panic*/ die(str, regs, err); } }
对于用户态发生的异常,会发送相应的信号,后续的信号发送主要代码流程为(不详述):
force_sig_info -> specific_send_sig_info ->send_signal ->__send_signal
信号处理
信号处理是异步过程,内核向用户态进程发送信号后,信号并不会得到立即处理,信号的处理时机有几个,最主要的就是就进程得到调度的时候,当进程得到调度后,就会处理相应的信号,信号处理的主要代码流程如下:
do_signal ->get_signal ->sig_kernel_coredump ->do_coredump
具体代码就不列了,有点乏味~,这里主要强调一下,什么信号会最终导致core文件的生成,关键就在于SIG_KERNEL_COREDUMP_MASK
宏:
#define SIG_KERNEL_COREDUMP_MASK (\rt_sigmask(SIGQUIT) | rt_sigmask(SIGILL) | \rt_sigmask(SIGTRAP) | rt_sigmask(SIGABRT) | \rt_sigmask(SIGFPE) | rt_sigmask(SIGSEGV) | \rt_sigmask(SIGBUS) | rt_sigmask(SIGSYS) | \rt_sigmask(SIGXCPU) | rt_sigmask(SIGXFSZ) | \SIGEMT_MASK
这个宏中列出的信号都会产生core文件,信号不只是内核可以发送,用户态当然也可以发送,最简单的就是kill命令,如果向让某进程产生core文件,可以直接向其发送信号(比如SIGSEGV、SIGBUS),当然最简单的可能就是gcore命令了,损伤最小,扯远了~
相关配置
最后,再补充一下core文件的相关配置,主要就是两个地方:
- /proc/sys/kernel/core_pattern,也可以通过sysctl.conf配置,用于控制core文件的生成规则。
- ulimit -c控制core文件的大小,如果设置为0,则不会生成core文件。
不罗嗦其他的了。
原文地址: http://happyseeker.github.io/kernel/2016/03/04/core-dump-mechanism.html
Core Dump流程分析相关推荐
- core dump 崩溃分析
linux core dump 分析无调试符号 core dump 文件 linux core dump 一般称为核心转储.内核转储,统称为转储文件. 代表某个时刻.某个进程的内存信息映射.包含了生成 ...
- 容器进程Core Dump处理
本文主要介绍了Core Dump实现容器进程的方法和相关内容. 上篇文章回顾:IPv6入门教程 引子 在我们调试程序时经常会使用到Core Dump(https://en.wikipedia.org/ ...
- JDK core dump分析
Java项目一般使用jstack, jmap等Java工具都可以分析进程bug,但是有时候jvm自身异常退出,此时往往没有hprof文件,而是生成了core文件,特别是在使用JNI技术的项目中,这时候 ...
- gcore 获取程序core dump file 但程序不用退出,gdb 分析core
转载地址: http://hi.baidu.com/widebright/item/e94ea43535711f4a3075a1d0 本文包含如下部分内容 1. Linux内核里面生成的core fi ...
- Core Dump 核心转储-进程异常分析jmap命令
Core Dump 核心转储 一.简介 程序运行过程中异常退出定位,查看到程序异常时的所有信息,变量值.栈信息.内存数据,程序异常时的运行位置(甚至记录代码行号)等等 jdk/bin目录下 ./jma ...
- core dump 分析
环境变量设置 可以通过 /etc/security/limits 文件对各用户的基本配置参数包括 core 大小进行限制.或者通过 ulimit 更改当前环境下的 core 大小限制. 默认情况下,应 ...
- oracle dump 源码,AIX 下的 core dump 分析入门
AIX 下的 core dump 分析入门 (), 工程师, IBM 作者毕业于中国科学技术大学,目前任职于 IBM,主要方向为 AIX 平台移植.性能优化.问题定位等. 简介: 本文简要介绍了 AI ...
- Linux上Core Dump文件的形成和分析
Core,又称之为Core Dump文件,是Unix/Linux操作系统的一种机制,对于线上服务而言,Core令人闻之色变,因为出Core的过程意味着服务暂时不能正常响应,需要恢复,并且随着吐Core ...
- java core 作者_java core dump分析实战
hs_err_pid简介 hs_err_pid.log是java程序发生core的时候产生的文件,里面有当时出错时jvm的执行情况. 排查方法 头文件解读可以查看问题 头文件包含了简单的信息阐述,里面 ...
最新文章
- PAT甲级1048 Find Coins :[C++题解]哈希表、两个硬币之和为定值
- 课后作业-结队编程项目进度-贪吃蛇
- android 信号强度变化,Android监听WIFI网络的变化并且获得当前信号强度
- 问题 L: 超超的中等意思
- 如何激活Microsoft Office 2010?
- ThreadLocal总结(jdk1.8源码)
- 【路径规划】基于matalb遗传算法机器人栅格地图路径规划【含Matlab源码 022期】
- HTML5 网站大观:15个精美的 HTML5 作品集网站实例
- 贪吃蛇c加加代码_贪吃蛇 C语言源代码
- ThinkPad P73 拆机清灰日志
- 面试:Android数据库升级给表增加字段
- 摄像机和镜头的基础知识
- linux开启IP转发
- CodeWars刷题笔记
- 云原生应用负载均衡系列 (2): 入口流量分发、容错与高可用调度
- 通过快递100获取快递单号,结合c-lodop热敏纸打印 – 通过菜鸟ISV/自研ERP使用菜鸟电子面单...
- 超级计算机app不能解方程,有了这款被 App Store 官方推荐的超级计算器,该把手头的计算器扔了...
- [luogu] P1637 三元上升子序列 树状数组
- 传奇创世孙大宁:2016年H5将井喷,新传播途径是突破口
- 蛇形填数(蛇形矩阵)c++