㈠ linux core 文件 怎么分析
Core文件,也称为Core Dump文件,是Unix/Linux操作系统中的一种机制。对于线上服务而言,Core文件的产生往往意味着服务暂时无法正常响应,需要恢复。随着吐出Core文件的进程内存空间增大,这个过程可能持续较长时间。例如,当进程占用超过60GB内存时,完整Core文件的写入磁盘可能需要15分钟,期间产生的流量损失难以估量。
然而,Core文件的存在也有其正面作用。在进程被终止的同时,操作系统会保存下当时的现场数据,这些数据就像是被按下的快门所拍摄的照片。照片中包含了进程终止时的内存、CPU寄存器等信息,这些数据可以供开发人员进行调试。Core文件的产生原因多种多样,例如在某些Unix版本中,由于不支持现代Linux上的GDB直接附着到进程上进行调试的机制,需要先向进程发送终止信号,然后用工具阅读Core文件。在Linux系统中,我们可以通过kill命令向指定进程发送信号或使用gcore命令使其主动产生Core文件并退出。
从浅层次来看,Core文件的产生意味着当前进程存在Bug,需要程序员修复。从深层次来看,这实际上是当前进程触犯了某些OS层级的保护机制,促使OS向当前进程发送诸如SIGSEGV(即信号11)之类的信号,例如访问空指针或数组越界。实际上,这反映了对OS内存管理的触犯,访问了非当前进程的内存空间。OS通过Core文件进行警示,就像人体内的病毒触发免疫系统的发热反应一样。有趣的是,并非每次数组越界都会产生Core文件,这与OS内存管理中的虚拟页面分配大小和边界有关。即使不出Core文件,也可能读到脏数据,引起程序行为紊乱,这是一类难以追踪的Bug。
Core文件的产生行为和方式可以通过两种途径进行控制。首先,可以修改/proc/sys/kernel/core_pattern文件,此文件用于控制Core文件的生成规则。默认情况下,文件内容为“core”。此文件支持定制,可以使用%配合不同的字符,例如%p表示出Core进程的PID,%u表示出Core进程的UID,%s表示造成Core的信号号,%t表示出Core的时间,%e表示出Core进程对应的可执行文件名。其次,可以使用ulimit -c命令显示当前OS对于Core文件大小的限制。如果为0,则表示不允许产生Core文件。如果想进行修改,可以使用ulimit -c n,其中n为数字,表示允许Core文件体积的最大值,单位为KB。如果想设为无限大,可以执行ulimit -c unlimited。
产生Core文件之后,就需要对其进行查看和分析,以确定问题所在并进行修复。为此,我们可以先了解Core文件的格式,多了解一些Core文件的相关信息。
㈡ Linux CoreDump 生成原理剖析
core文件是Linux系统在程序遇到严重错误时自动生成的一种文件,用于记录现场信息,以便后续进行原因追踪与分析。核心信息由Linux内核负责生成。
core文件的结构大致由ELF文件和特定类型段组成,类型标记为CORE,其中包含一个用于存放丰富现场信息的NOTE段,以及一个或多个LOAD段,这些LOAD段对应虚拟地址空间的片段。
核心信息段包括但不限于每个线程的寄存器状态、地址空间中文件映射情况、触发信号详情、线程局部变量信息等,为故障诊断提供宝贵的线索。
核心文件的生成途径主要通过向程序发送特定信号来触发,如SIGABRT信号或其他引起系统异常的错误。当程序从内核态转回用户态时,系统会检查是否需要处理信号。若用户自定义了信号处理函数,则返回至该函数执行;否则内核会执行默认处理逻辑,清理资源或终止进程。
用户态下生成coremp通常通过调用abort()函数实现,该函数最终通过系统调用syscall kill向目标进程发送SIGABRT信号。杀信号的处理过程包括设置相关标志,返回用户态检查,等待子线程结束并收集虚拟地址空间映射信息,最后将这些信息序列化到核心文件中。