Android NE(1)

任何软件都可能存在BUG,调试和修复BUG伴随着整个开发流程,因此异常分析非常重要。如果是native层发生异常,我们一般称之为叫NE(native exception)

异常可能发生任何一层,如果是:

  • kernel层发生异常,叫KE(kernel exception)
  • native层发生异常,叫NE(native exception)
  • java成异常,叫JE(java exception)

1. NE简介

Native层是由各种lib/binary组成,这一层发生异常,我们称之为NE(native exception)
一般我们用offline调试,通过coredump借助gdb或trace32来调试。首先要先熟悉下linux信号和ptrace机制,coredump是通过信号触发生成的。coredump是进程空间保存到文件系统的镜像,因此能看到异常时刻的所有变量值,就可以知道问题出在哪里。
Android是基于linux的,发生异常时,Android扩展了调试机制,这个机制是debuggerd机制。在没有coredump下,debuggerd以log或者tombstone的方式输出异常信息。

本地应用程序是指可以直接运行在操作系统上,并且处理器直接执行机器码的程序。

在Android上,OS是linux,因此各种bin程序就是所谓的natvie application,比如/system/bin目录下的所有文件。

这些应用程序都是由GCC(c/c++)编译生成。

在Android软件架构里,这些应用程序组成了native layer:

native layer里的应用程序崩溃统称为Native Exception,即NE,比如空指针,非法指针,程序跑飞,内存踩坏等。

1.1. 发生NE流程

原始的linux,对于用户进程崩溃之后,处理方式有2种:

  1. 直接终止进程;
  2. 输出coredump再终止进程

而在Android,为了方便调试,在收到崩溃信号后,会先输出tombstone,然后在根据设置是否抓取coredump,最后再终止进程。

如果发生NE,内核会抛出信号,可以通过kernel log搜索sig 11/7等几个可以导致进程崩溃的关键字判断。

此处的信号注册是发生在动态链接程序加载的时候,链接器(linker)负责将应用程序所需的库加载到进程空间内,然后跑应用程序大妈。linker在执行期间会注册信号。

流程:__linker_init() -> __linker_init_post_relocation() -> debuggerd_init()

1.2. 信号处理

目前会产生native exception(NE)的几个信号需要特别掌握产生的原因,这样才能进一步分析问题所在。

内核发送信号过来后会执行debuggerd_init()里注册的函数debugger_signal_handler(),该

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值