闲话

最近分析问题时,发现我的环境中,经常有用户态进程异常退出,但是却没有core文件生成,简单看了一下相关的内核流程,mark一下。

Core Dump基本原理

当应用程序在用户态发生异常时,比如常见的段错误,通常会生成core文件,通过gdb分析core文件,基本就能定位问题。

core文件实际是当前进程地址空间的一个镜像文件,其中包含了该进程在内存中的所有信息。

Linux系统中,Core Dump的主要流程描述为:

  1. 进程运行过程中出现异常(比如段错误),该异常为硬件上报,可理解为一个中断,异常上报后,CPU在执行完当前的指令后会立刻停止执行当前上下文中的指令,而进入异常处理流程:常规的保存上下文,跳转到相应的中断向量处执行等,具体不详述了。
  2. 进入异常处理流程后,会判断发生异常的CPU模式(X86中对应相应的Ring),如果发生异常时,处于用户态,则说明该异常只会影响当前进程,于是向用户态进程发送相应的信号,如果是段错误,发送的信号为SIGSEGV,如果为Aborts,通常发送的信号为SIGBUS。如果发生异常时处于内核态,则说明该异常对系统是致命的,则会进入内核die流程,最终会panic,这种情况不会生成core文件,不是这里讨论的重点。
  3. 当用户态进程有处理信号的时机时(比如得到调度),其会检查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文件的相关配置,主要就是两个地方:

  1. /proc/sys/kernel/core_pattern,也可以通过sysctl.conf配置,用于控制core文件的生成规则。
  2. ulimit -c控制core文件的大小,如果设置为0,则不会生成core文件。

不罗嗦其他的了。

原文地址: http://happyseeker.github.io/kernel/2016/03/04/core-dump-mechanism.html

Core Dump流程分析相关推荐

  1. core dump 崩溃分析

    linux core dump 分析无调试符号 core dump 文件 linux core dump 一般称为核心转储.内核转储,统称为转储文件. 代表某个时刻.某个进程的内存信息映射.包含了生成 ...

  2. 容器进程Core Dump处理

    本文主要介绍了Core Dump实现容器进程的方法和相关内容. 上篇文章回顾:IPv6入门教程 引子 在我们调试程序时经常会使用到Core Dump(https://en.wikipedia.org/ ...

  3. JDK core dump分析

    Java项目一般使用jstack, jmap等Java工具都可以分析进程bug,但是有时候jvm自身异常退出,此时往往没有hprof文件,而是生成了core文件,特别是在使用JNI技术的项目中,这时候 ...

  4. gcore 获取程序core dump file 但程序不用退出,gdb 分析core

    转载地址: http://hi.baidu.com/widebright/item/e94ea43535711f4a3075a1d0 本文包含如下部分内容 1. Linux内核里面生成的core fi ...

  5. Core Dump 核心转储-进程异常分析jmap命令

    Core Dump 核心转储 一.简介 程序运行过程中异常退出定位,查看到程序异常时的所有信息,变量值.栈信息.内存数据,程序异常时的运行位置(甚至记录代码行号)等等 jdk/bin目录下 ./jma ...

  6. core dump 分析

    环境变量设置 可以通过 /etc/security/limits 文件对各用户的基本配置参数包括 core 大小进行限制.或者通过 ulimit 更改当前环境下的 core 大小限制. 默认情况下,应 ...

  7. oracle dump 源码,AIX 下的 core dump 分析入门

    AIX 下的 core dump 分析入门 (), 工程师, IBM 作者毕业于中国科学技术大学,目前任职于 IBM,主要方向为 AIX 平台移植.性能优化.问题定位等. 简介: 本文简要介绍了 AI ...

  8. Linux上Core Dump文件的形成和分析

    Core,又称之为Core Dump文件,是Unix/Linux操作系统的一种机制,对于线上服务而言,Core令人闻之色变,因为出Core的过程意味着服务暂时不能正常响应,需要恢复,并且随着吐Core ...

  9. java core 作者_java core dump分析实战

    hs_err_pid简介 hs_err_pid.log是java程序发生core的时候产生的文件,里面有当时出错时jvm的执行情况. 排查方法 头文件解读可以查看问题 头文件包含了简单的信息阐述,里面 ...

最新文章

  1. PAT甲级1048 Find Coins :[C++题解]哈希表、两个硬币之和为定值
  2. 课后作业-结队编程项目进度-贪吃蛇
  3. android 信号强度变化,Android监听WIFI网络的变化并且获得当前信号强度
  4. 问题 L: 超超的中等意思
  5. 如何激活Microsoft Office 2010?
  6. ThreadLocal总结(jdk1.8源码)
  7. 【路径规划】基于matalb遗传算法机器人栅格地图路径规划【含Matlab源码 022期】
  8. HTML5 网站大观:15个精美的 HTML5 作品集网站实例
  9. 贪吃蛇c加加代码_贪吃蛇 C语言源代码
  10. ThinkPad P73 拆机清灰日志
  11. 面试:Android数据库升级给表增加字段
  12. 摄像机和镜头的基础知识
  13. linux开启IP转发
  14. CodeWars刷题笔记
  15. 云原生应用负载均衡系列 (2): 入口流量分发、容错与高可用调度
  16. 通过快递100获取快递单号,结合c-lodop热敏纸打印 – 通过菜鸟ISV/自研ERP使用菜鸟电子面单...
  17. 超级计算机app不能解方程,有了这款被 App Store 官方推荐的超级计算器,该把手头的计算器扔了...
  18. [luogu] P1637 三元上升子序列 树状数组
  19. 传奇创世孙大宁:2016年H5将井喷,新传播途径是突破口
  20. 蛇形填数(蛇形矩阵)c++

热门文章

  1. Solr4.7从数据库导数据
  2. RHEL 6 下VNC Server 的安装配置
  3. cuda-Block和Grid设定
  4. 常见测量矩阵的MATLAB实现
  5. matlab工作区保留或者清除部分变量
  6. [云炬创业管理笔记]第三章打造优秀创业团队讨论1
  7. [云炬创业基础笔记]第六章商业模式测试11
  8. [云炬创业基础笔记] 第四章测试16
  9. 科大星云诗社动态20210421
  10. GBDT!深入浅出详解梯度提升决策树