Core file 文件格式(Linux Coredump文件结构)

本文详细介绍了Linux系统下Coredump文件的格式,强调其作为ELF格式的特殊性,只包含Executing View,不包含Linking View。内容涵盖Coredump如何保存内存段、线程状态、寄存器信息,并通过源码分析了生成和解析Coredump的过程。通过实例展示了Coredump文件的头部结构和Program Headers信息,解释了如何利用工具如readelf解析这些信息。尽管Coredump不包含代码段,但配合GDB和动态库信息,仍能有效进行调试和问题分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[原创]转载请注明来源于CSDN _xiao。

Linux异常时会生成Coredump文件用于调试和分析,Coredump文件在嵌入式工作中对死机问题的帮助是非常大的。网上有很多生成core文件的配置方法,但却很少涉及core文件的数据格式,这里通过linux的源码走读尝试解读Coredump文件的格式。

Coredump文件的整体格式是ELF格式,但在ELF格式定义中对Core子类别的定义是开放的,由各架构自己定义,因此Core文件在不同的体系中格式是有差别的。这里主要说明Linux下生成的Core文件,另外我们在工作中通常接触的指令架构是ARMMIPS

Coredump文件按ELF格式组织,不过它只有Executing View,没有Linking View,也就是只有Program Headers,没有Section Heders。所以用readelf命令查看时只能看到Segments而看不到Sections。异常产生时,Linux将死机进程的内存段的内容以Segment的形式保存到Coredump文件中(包括数据区,堆栈区,已分配的堆内容,以及死机时的帧结构数据等),对于代码段(属性为RX,即只读可执行的段),Linux不保存其内容,只保存代码段的地址信息;其它如线程信息、寄存器信息等辅助信息则保存在类型为PT_NOTESegment段中。所以使用GDB工具查看时,需要原始的可执行文件来恢复代码区的内容。

Linux生成Coredump的相关代码在3.1.10\fs\binfmt_elf.c中。

从函数elf_core_dump看起。首先申请空间存放elfhdr文件头,然后通过current->mm->map_count得到当前进程已映射的内存段数量,计算core文件中需要生成的segment数量,这里会多保留一个segmentPT_NOTE使用。然后调用fill_note_info填充note段信息。在fill_note_info里,先将所有的task放到info->thread_list链表中,然后遍历该链表,对每一个thread调用elf_dump_thread_status来保存该线程的状态。在elf_dump_thread_status中,先调用fill_prstatus获取线程状态,这包括收到的signal(对死机线程而言就是引起coredump的信号了),pendingholdsignal,线程的pid,pgrp,ppid等各种数据。再调用elf_core_copy_task_regs获取线程的寄存器,这里对ARMMIPS会调用各自的函数来保存寄存器,例如MIPS会调用3.1.10\arch\mips\kernel\binfmt_elfo32.c里的elf32_core_copy_regs函数来获取MIPS寄存器的内容,再调用elf_core_copy_task_fpregs获取线程的浮点寄存器内容,在获取完信息后都会调用fill_note将这些信息放到类型为memelfnotenotes数组中(后面会利用这个notes数组再将所有信息保存到PT_NOTE段中)。回到elf_core_dump,现在获得了所有的note,所以可以计算出整个note段的大小,以及计算所有Program Header的地址信息了。填充elf头,为所有的Program header

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值