CoreDump使用与实现原理

一、背景

系统发生native crash时,针对内存异常访问、内存踩踏等疑难问题,由于tombstone信息量不足无法精确定位分析这类问题。

二、coredump介绍

2.1 什么是coredump

当用户程序运行过程中发生异常, 程序异常退出时, 由Linux内核把程序当前的内存状态信息(运行时的内存,寄存器状态,堆栈指针,各种函数调用堆栈信息等)存储在一个core文件中, 这个过程称作coredump.

2.2 coredump作用

coredump主要应用于解决NE问题(native exception)。用户进程发生native crash时,tombstone会抓取一些简单的backtrace信息,但是对于定位一些内存访问异常、内存被踩的疑难问题来说,tombstone信息量不充足导致无法精确定位分析问题,这个时候就需要使用到coredump分析这类问题。

2.3 什么情况下触发coredump

从进程发生异常类型维度来看,当native进程发生内存越界访问、堆栈溢出、非法指针等操作时,会触发coredump

从进程接收的信号类型来看,当native进程接收SIGQUIT、SIGABRT、SIGSEGV、SIGTRAP等信号时,会触发coredump

三、如何使用coredump

在Android平台默认关闭coredump,需要手动打开。

1.打开coredump开关

1) 检查系统 coredump 是否开启ulimit -c  // 返回 0,则未启用
2) 打开coredump   ulimit -c 1024 // 设置成 1024 byte    或者ulimit -c unlimited  // 设置成无限大

2.设置coredump生成文件的路径

// 如果不设置文件路径,core文件生成的位置默认是可执行文件所在的位置 
echo "/data/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

3.当检测到进程异常退出时,会在指定的路径下生成core文件(格式为elf),可以结合gdb工具调试分析

1)将可执行文件和core文件放在一个目录下

2)执行gdb {binary_name} {core_file_name}命令,解析core文件,定位分析问题

详见第五章Demo案例。

四、coredump实现原理

4.1 基本原理

用户程序发生某些错误或异常时,在Linux内核会捕获到异常,并给用户进程发送signal异常信号,进程在返回用户空间之前处理信号,调用Linux内核coredump,生成elf格式的core文件,保存到指定的路径。

4.2 核心代码段

调用 do_coredump 函数来生成 core文件。如下:

void do_coredump(const kernel_siginfo_t *siginfo)
{......binfmt = mm->binfmt;if (!binfmt || !binfmt->core_dump)goto fail;if (!__get_dumpable(cprm.mm_flags))goto fail;......// 1.生成core文件名称ispipe = format_corename(&cn, &cprm, &argv, &argc);......// 2.创建core文件cprm.file = file_open_root(&root, cn.corename, open_flags, 0600);......// 3.将进程的内存信息写入core文件core_dumped = binfmt->core_dump(&cprm);......
}

elf_core_dump 函数负责将进程的内存状态信息写入elf格式的core文件,以便后续的gdb调试和分析。如下:

// kernel_platform/msm-kernel/fs/binfmt_elf.cstatic int elf_core_dump(struct coredump_params *cprm)
{....../** Collect all the non-memory information about the process for the* notes.  This also sets up the file header.*/// 1.函数填充 ELF 头部和 notes 信息if (!fill_note_info(&elf, e_phnum, &info, cprm))goto end_coredump;has_dumped = 1;// 2.计算 ELF 头部、程序头部和 notes 节的大小,并分配相应的内存offset += sizeof(elf);                                /* Elf header */offset += segs * sizeof(struct elf_phdr);        /* Program headers */....../* Write program headers for segments dump */for (i = 0; i < cprm->vma_count; i++) {struct core_vma_metadata *meta = cprm->vma_meta + i;struct elf_phdr phdr;phdr.p_type = PT_LOAD;phdr.p_offset = offset;phdr.p_vaddr = meta->start;phdr.p_paddr = 0;phdr.p_filesz = meta->dump_size;phdr.p_memsz = meta->end - meta->start;offset += phdr.p_filesz;phdr.p_flags = 0;if (meta->flags & VM_READ)phdr.p_flags |= PF_R;if (meta->flags & VM_WRITE)phdr.p_flags |= PF_W;if (meta->flags & VM_EXEC)phdr.p_flags |= PF_X;phdr.p_align = ELF_EXEC_PAGESIZE;if (!dump_emit(cprm, &phdr, sizeof(phdr)))goto end_coredump;}// 3.写入 ELF 头部和程序头部if (!elf_core_write_extra_phdrs(cprm, offset))goto end_coredump;/* write out the notes section */// 4.写入 notes信息if (!write_note_info(&info, cprm))goto end_coredump;/* For cell spufs */// 5.写入数据段if (elf_coredump_extra_notes_write(cprm))goto end_coredump;/* Align to page */dump_skip_to(cprm, dataoff);for (i = 0; i < cprm->vma_count; i++) {struct core_vma_metadata *meta = cprm->vma_meta + i;if (!dump_user_range(cprm, meta->start, meta->dump_size))goto end_coredump;}// 6.写入扩展编号if (!elf_core_write_extra_data(cprm))goto end_coredump;if (e_phnum == PN_XNUM) {if (!dump_emit(cprm, shdr4extnum, sizeof(*shdr4extnum)))goto end_coredump;}end_coredump:free_note_info(&info);kfree(shdr4extnum);kfree(phdr4note);return has_dumped;
}

4.3 代码时序

异常捕获、信号处理&生成core文件的功能逻辑的代码时序,如下:

4.4 core文件格式及内容

coredump抓取的core文件为elf格式,可以使用gdb调试,定位分析问题。

core文件内容,如下:

ELF Header:Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class:                             ELF64Data:                              2's complement, little endianVersion:                           1 (current)OS/ABI:                            UNIX - System VABI Version:                       0Type:                              CORE (Core file)Machine:                           AArch64Version:                           0x1Entry point address:               0x0Start of program headers:          64 (bytes into file)Start of section headers:          0 (bytes into file)Flags:                             0x0Size of this header:               64 (bytes)Size of program headers:           56 (bytes)Number of program headers:         138Size of section headers:           0 (bytes)Number of section headers:         0Section header string table index: 0Program Headers:Type           Offset             VirtAddr           PhysAddrFileSiz            MemSiz              Flags  AlignNOTE           0x0000000000001e70 0x0000000000000000 0x00000000000000000x00000000000018a8 0x0000000000000000         0x0LOAD           0x0000000000004000 0x000000560ca89000 0x00000000000000000x0000000000000000 0x0000000000002000  R      0x1000LOAD           0x0000000000004000 0x000000560ca8b000 0x00000000000000000x0000000000000000 0x0000000000003000  R E    0x1000LOAD           0x0000000000004000 0x000000560ca8e000 0x00000000000000000x0000000000001000 0x0000000000001000  R      0x1000
...Displaying notes found at file offset 0x00001e70 with length 0x000018a8:Owner                Data size         DescriptionCORE                 0x00000188        NT_PRSTATUS (prstatus structure)CORE                 0x00000088        NT_PRPSINFO (prpsinfo structure)CORE                 0x00000080        NT_SIGINFO (siginfo_t data)CORE                 0x00000150        NT_AUXV (auxiliary vector)CORE                 0x00000f6e        NT_FILE (mapped files)Page size: 4096Start                 End         Page Offset0x000000560ca89000  0x000000560ca8b000  0x0000000000000000/system/bin/coredump-test-bin0x000000560ca8b000  0x000000560ca8e000  0x0000000000000002/system/bin/coredump-test-bin
...
CORE                 0x00000210        NT_FPREGSET (floating point registers)LINUX                0x00000010        NT_ARM_TLS (AArch TLS registers)description data: 00 10 e4 45 7e 00 00 00 00 00 00 00 00 00 00 00 LINUX                0x00000108        NT_ARM_HW_BREAK (AArch hardware breakpoint registers)description data: 06 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 LINUX                0x00000108        NT_ARM_HW_WATCH (AArch hardware watchpoint registers)description data: 04 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 LINUX                0x00000004        Unknown note type: (0x00000404)description data: ff ff ff ff LINUX                0x00000010        Unknown note type: (0x00000406)description data: 00 00 00 00 80 ff 7f 00 00 00 00 00 80 ff 7f 00 LINUX                0x00000008        Unknown note type: (0x0000040a)description data: 0f 00 00 00 00 00 00 00 LINUX                0x00000008        Unknown note type: (0x00000409)description data: 01 00 00 00 00 00 00 00

core文件内容主要包括ELF Header、Program Headers、NOTE segment.

ELF Header:用于记录core文件的基本信息和结构。

Program Headers: 记录内存中映射文件的信息,以及segment的权限和属性。

NOTE segment:记录进程崩溃时刻的进程状态、寄存器、信号信息、辅助向量和映射文件的详细信息。通过这些信息,gdb调试工具可以重建崩溃时的内存布局,分析崩溃原因,并帮助开发者精确定位分析问题。

五、Demo案例

1)Demo程序

进程发生异常crash后,抓取tombstone和core文件。

2)生成的tombstone文件

从抓取的tombstone文件分析,只能看出大致的原因,无法精确定位到根本原因或哪句代码出错导致进程crash.因此,需要借助coredump,抓取core文件来精确定位分析这类问题。

Cmdline: ../../system/bin/coredump-test-bin use-after-free
pid: 11966, tid: 11966, name: coredump-test-b  >>> ../../system/bin/coredump-test-bin <<<
uid: 0
...
backtrace:#01 pc 0000000000090088  /system/lib64/libc.so (__vfprintf+10416) (BuildId: 567e41669f1cb528e72fe319cd09033b)#02 pc 00000000000ac06c  /system/lib64/libc.so (vsnprintf+192) (BuildId: 567e41669f1cb528e72fe319cd09033b)#03 pc 0000000000006afc  /system/lib64/liblog.so (__android_log_print+184) (BuildId: 87ba6a9314f00fab650fb8fad7913d58)#04 pc 00000000000010a4  /system/bin/coredump-test-bin (main+80) (BuildId: c97bade065c198c12dcca74f107c513c)#05 pc 0000000000048768  /system/lib64/libc.so (__libc_init+96) (BuildId: 567e41669f1cb
...

3)生成的core文件

打开coredump功能,抓取core文件。core文件为elf格式,可以用gdb调试。

用gdb调试Demo程序和生成的core文件,执行gdb ./coredump-test-bin ./core-coredump-test-bin-11966-1720526041命令,可以精确定位到是源文件哪一行代码出错,如下:

--->             ...            Program terminated with signal SIGSEGV,       Segmentation fault.            #0  0x000000000040053c in square (a=1, b=2) at test.c:7            7               *p = 666;  # 可见在test.c中的第7行,出现了问题。
# (gdb) backtrace // 输入backtrace    --->             #0  0x000000000040053c in square (a=1, b=2) at test.c:7   // 可见在test.c中的第7行,出现了问题。            #1  0x0000000000400564 in doCalc (num1=1, num2=2) at test.c:14             #2  0x0000000000400591 in main () at test.c:22

六、风险及解决方案

打开coredump功能,存在以下风险:

1)若系统中存在native进程反复crash自启,尤其在研发阶段这种现象很普遍,会导致持续不断产生core文件,磁盘空间很快被占满。

解决方案:结合quota机制,core文件路径存储空间分配project_id,设置quota阈值(存储空间上限),超过阈值就自动覆盖老的文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/870807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ss工具dump出vsock 端口号异常分析

端口冲突时&#xff0c;会出现bind fail异常&#xff0c;这时可以用ss --vsock -pl命令dump出所有listen状态的vsock,但实际发现传入的9000端口&#xff0c;dump出来却是10275&#xff0c;如下图&#xff1a; 难道是内核把端口改了&#xff1f;分析内核态源码&#xff0c;ss最终…

模拟器大揭秘:功能多样,热门APP一网打尽

在咱们日常的数字生活中&#xff0c;模拟器这个词儿你可能不陌生&#xff0c;但它到底能干啥&#xff1f;又有哪些好用的模拟器APP呢&#xff1f; 今天&#xff0c;咱们就来聊聊模拟器的功能&#xff0c;并推荐几款热门的模拟器APP&#xff0c;帮助大家更好地利用这一技术。 …

Math/System/Runtime/Object

1、Math &#xff08;1&#xff09;常用方法 类型方法名说明public static intabs (int a)返回整数的绝对值public static doublepow (double a,double b)计算a的b次幂的值public static int max (int a,int b) 获取两个int值中的较大值public static intmin (int a,int…

java读取配置文件(包含国家于二字码对应关系文件)

读取配置文件 1.java文件 import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.ClassPathResource;import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Map; Slf4j public class…

数据结构笔记之连通图与强连通图

一、引言 在图论中&#xff0c;我们常常会遇到连通图和强连通图的概念。它们描述了图中顶点之间的连接情况&#xff0c;对于理解和分析复杂网络具有重要意义。 二、连通图 定义&#xff1a;若图G中任意两个顶点都是连通的&#xff0c;则称图G为连通图&#xff1b;否则称为非…

如何使用可道云结合内网穿透工具实现远程访问打造私人云盘

文章目录 1.前言2. Kodcloud网站搭建2.1. Kodcloud下载和安装2.2 Kodcloud网页测试 3. cpolar内网穿透的安装和注册4. 本地网页发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6.结语 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易…

【HTML入门】第十课 - 表格,也就是table标签

这一小节&#xff0c;我们说一下HTML中的表格。比如我们常常看见的学生成绩单&#xff0c;比如excel一个单元格一个单元格的&#xff0c;这些都是表格。 表格的标签名是 table 。 目录 1 表格中的一些子标签 1.1 表头区域 1.2 表格内容区域 1.3 行和列 2 实战一小下 2.…

JavaWeb(一:基础知识和环境搭建)

一、基本概念 1.前言 JavaWeb&#xff1a;在Java中&#xff0c;动态web资源开发网页的技术。 web应用分两种&#xff1a;静态web资源和动态web资源 Ⅰ. 静态web资源&#xff08;如html 页面&#xff09;&#xff1a; 指web页面中的数据始终是不变。 所有用户看到都是同一个…

python编程实例 输出两个数之间的素数

#输出两个数之间有多少素数 import math mint(input("开始&#xff1a;")) nint(input("结束&#xff1a;")) for i in range(m,n1):for j in range(2,int(math.sqrt(i))1):if i%j0:breakif(jint(math.sqrt(i))):print(str(i),"是一个素数")

DP(2) | Java | LeetCode 62, 63, 343, 96 做题总结(96 未完)

62.不同路径 我的代码&#xff08;报错&#xff09; 写的过程中感到很迷惑的点&#xff1a;①二维数组和这道题目的对应弄不清除&#xff0c;m n的初始化 是 dp[m][n] 还是 dp[n][m] ② class Solution {public int uniquePaths(int m, int n) {int[][]dp new int[m1][n1];d…

单目3D和bev综述

文章目录 SOTA2D 检测单目3d检测单目bev&#xff0c;一般是多目&#xff0c;小鹅通3d bev cam范式Transformer attention is all you need 2017ViT vision transformer ICLR 2021googleDETR 2020DETR3D 2021PETR 2022bevformerLSSbevdetcaddn指标 mAP NDS标注&#xff1a;基于点…

利用js实现图片压缩功能

图片压缩在众多应用场景中扮演着至关重要的角色&#xff0c;尤其是在客户端上传图片时。原始图片往往体积庞大&#xff0c;直接上传不仅消耗大量带宽资源&#xff0c;还可能导致上传速度缓慢&#xff0c;严重影响用户体验。因此&#xff0c;在图片上传至服务器前对其进行压缩处…

嵌入式开发过程中,常见报错以及解决方法

编写不易&#xff0c;仅供学习&#xff0c;参考谢谢&#xff0c;还望理解。 #常见报错 文件最后一行没有新行 翻译&#xff1a;文件的最后一行结束时没有新行 解决方法&#xff1a;定位到&#xff0c;提示报错的 .h 文件 报错行 &#xff0c;加上一个新行 函数定义时与官方提…

网信大数据信用报告查询怎么查?网信大数据有什么作用?

随着互联网的快速发展&#xff0c;大数据技术已经广泛应用于各行各业。其中&#xff0c;网信大数据信用报告查询成为了许多人关注的焦点。那么&#xff0c;如何查询网信大数据信用报告呢?网信大数据又有哪些作用呢?本文将为您一一解答。 一、如何查询网信大数据信用报告? 要…

NodeJS校园快递智能互助平台-计算机毕业设计源码58554

摘 要 随着校园人口的增加和生活节奏的加快&#xff0c;校园快递成为一个重要的服务需求。然而&#xff0c;传统的校园快递方式存在一些问题&#xff0c;例如无法满足快速和高效的需求&#xff0c;易发生丢失或损坏的情况&#xff0c;同时也给快递人员和用户带来不便。因此&am…

C++ 实现图书馆资料管理系统

1、问题描述 &#xff1a; 图书馆中的资料很多&#xff0c;如果能分类对其资料流通进行管理&#xff0c;将会带来很多方 便&#xff0c;因此需要有一个媒体库管理系统。 图书馆共有三大类物品资料&#xff1a;图书、视频光盘、图画。 这三类物品共同具有的属性有&#xff1a;编…

「51媒体」制定《媒体邀约名单》,几点建议

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 当制定媒体邀约名单时&#xff0c;以下是一些建议&#x…

海事无人机解决方案

海事巡察 海事巡察现状 巡查效率低下&#xff0c;存在视野盲区&#xff0c;耗时长&#xff0c;人力成本高。 海事的职能 统一管理水上交通安全和防治船舶污染。 管理通航秩序、通航环境。负责水域的划定和监督管理&#xff0c;维护水 上交通秩序&#xff1b;核定船舶靠泊安…

日志自动分析-操作系统-GscanLogonTracerf8x

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

Vue 中的 scoped 和 /deep/ 深度选择器

Vue在组件里写 css 给 <style> 标签加上 scoped &#xff0c;比如&#xff1a; <style lang"less" scoped> &#xff0c;这样的 css 就是局部的&#xff0c;不会影响其他组件。 假设引入了一个子组件&#xff0c;并希望在组件中修改子组件的样式&#x…