平台: MSM8260
OS: Android 2.3.4
概述
一般的Linux中,当user space ap执行发生exception的时候,可能我们只能看到segment fault这样的错误,在pc上的话可以用gdb、backtrace来跟踪产生exception的地方, 但是如果在手机上的话就不好跟踪了,不过在android平台上,google提供了一个catch exception的守护进程,叫debuggerd。它能将user space发生的exception捕捉到然后通过logcat打印出来。
通过Log发现,它的call stack只有一些地址,而不是想kernel对应的function name.因此,得将这些offset转成function name才能是huma-readable嘛。
所以本文先分析debuggerd的catch原理,然后再讲述如何转换offset为function name。
原理
介绍
看下Debuggerd的大概执行流程如下:
不管它运用了什么工具或者功能,大概的流程是逃不掉的:
获取exception process pid -> 跟踪 -> 获取想要的info –> 保存到文件或者打印到shell中,下面分析code.
client
Android启动之后,在init.rc中,debuggerd会被作为一个service而启动。
看它main函数:
先建立一个作为logd的client,因为logd server需要从debuggerd service中获取信息,所以它被作为一个logd client存在了,这里我们可以不必理会。
然后将自己作为android:debuggerd的server,既然它作为server,肯定有client存在咯。以android:debuggerd为关键字搜索中…
有一个叫debugger.c@bionic\linker,看它做啥了。