[Android][Stability] NativeCrash分析(一)-NativeCrash原理

一.基础知识-编译,链接,装载

基础的程序怎么来的,怎么到内存运行的,参考如下:
[](https://blog.csdn.net/TaylorPotter/article/details/103778980

二.NativeCrash原理

Native 程序是指可以直接运行在操作系统上,并且处理器直接执行机器码的程序,比如 “/system/bin” “/system/lib” 目录下的文件,这些应用程序都是由GCC(c/c++)编译生成,这些程序的崩溃统称为Native Exception,比如空指针,非法指针,程序跑飞,内存踩坏等。

Native Crash都是进程收到信号引起的.

2.1 信号的来源:

在这里插入图片描述

盗图如上,一个进程收到信号可以是系统发送的也可以是另一个级别的进程发送的
但都需要经过内核,相当于内核需截获信号,预处理或善后操作:


在这里插入图片描述

信号注册和发送详细过程如下:


在这里插入图片描述
  1. 信号发送或信号注册的信息保存在目标进程的进程控制块中;
  2. 在进程返回用户态之前会检查进程的控制块signal的位图信息,需要处理的信号需要找到制定的处理函数指针去处理
  3. signal处理处理函数可以在目标进程中自定义,内核有默认处理信号的操作;
  4. 目标进程的signal处理函数处理完后会继续交给内核继续处理,内核做该进程的信号处理善后操作.

2.2 信号处理函数

绝大多数的用户空间进程的入口是linker,在linux中即ld动态链接器.为什么这么说?
如果该程序需要动态链接共享库,可执行文件装载进内存后第一次进入用户态当前cpu占寄存器上的指令地址是动态链接器的入口,需要先调用动态链接器解释可执行文件执行,需要首先链接加载共享库.

在android上,动态连接器即是linker,在linux上动态链接器即是ld动态连接器

如果该程序是一个静态链接的可执行文件,则在该可执行文件加载入内存后,第一次进入用户态时当前cpu占寄存器上的指令地址是该可执行文件的Entry point address.

当然大多数可可执行文件需要动态链接,比如一个libc就太多可执行文件需要用到.

2.3 Native程序注册信号过程

2.3.1 Native进程装载运行过程:

在这里插入图片描述

1.如图,大部分动态链接的可执行文件,进入用户空间入口是linker,linux上是ld动态链接器,android上是linker,
图中.interp section中即是可执行文件中保存动态链接器的地址,返回给startThread,在返回用户空间时pc指针指的就是动态链接器的入口地址.
2.如果是静态链接的可执行程序,入口即是可执行文件中指定的程序入口地址
3.大部分动态链接的可执行文件不包含动态链接的共享库,在装载到内存后发现依赖的so不在物理内存中便会去通过linker试图加载so至物理内存然后映射到虚拟地址空间,通过重定位已获取so的虚拟地址,以供程序使用.
4.从图中可以看出,在一个程序的main方法之前还跑了一些其他的方法,其中.init区函数是程序员可控的,比如写了一个全局的变量赋值为 new 一个对象,此时这个对象的初始化方法在.init区,会在main方法前执行.

2.3.2 Native程序注册信号简单过程:

在这里插入图片描述

文末附详细过程.

2.4 App进程注册信号过程

2.4.1 应用进程启动过程

在这里插入图片描述

2.4.2 zygote fork app process简单过程

在这里插入图片描述

从native角度来看,app进程都是可执行文件app_process的进程映像


在这里插入图片描述

2.4.3 App进程注册信号简单过程

在这里插入图片描述

文末附详细过程

2.5 Native Crash后处理过程

在这里插入图片描述

图中应该还需画出,当目标进程处理完信号(主要是日志的dump操作)之后内核还会对该信号进行善后处理,如释放进程资源,进程退出等.

debuggerd的主要操作过程:

在这里插入图片描述

文末附详细过程.

三.Debug材料及工具使用

https://blog.csdn.net/TaylorPotter/article/details/103785967

四.附录-代码详细过程:

1. linker初始化详细过程

在这里插入图片描述

2. native进程启动及信号注册详细流程
在这里插入图片描述

3. App进程启动及信号注册处理详细过程:
在这里插入图片描述

4. Native Crash处理详细流程:
在这里插入图片描述

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,808评论 0 27
  • 计算机系统漫游 代码从文本到可执行文件的过程(c语言示例):预处理阶段,处理 #inlcude , #defin...
    willdimagine阅读 3,584评论 0 5
  • 主要参考:《程序员的自我修养》读书总结编译与链接过程的思考linux 下动态链接实现原理研读《程序员的自我修养—链...
    林大鹏阅读 5,519评论 0 13
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,381评论 0 5
  • 1.内存的页面置换算法 (1)最佳置换算法(OPT)(理想置换算法):从主存中移出永远不再需要的页面;如无这样的...
    杰伦哎呦哎呦阅读 3,249评论 1 9