Android logcat解析与问题分析

logcat是Android中一个命令行工具,可以用于得到程序的log信息。

一、logcat 结构

   1、

   这个结构在AS或者exlipse上面看的更清楚

二、logcat中地址反差backtrace

     当程序崩溃的时候会在loacat中打印出backtrace,如下图所示

    这个backtrace在墓碑文件tombstone中更清楚

这个地址就是程序崩溃时的调用栈,如果用带符号表的so文件,可以通过地址反查找到程序崩溃时的代码位置,如下图

地址反查的命令:

32位:

本机所使用的ndk\toolchains\arm-linux-androideabi-4.6\prebuilt\windows-x86_64\bin\arm-linux-androideabi-addr2line -C -e XXX.so -f 0xXXXXXX

64位:

本机所使用的ndk\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-addr2line -C -e XXXX.so -f 0XXXXXX

以下例子中把本机所使用的ndk\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin设置到了环境变量中,所以可以直接使用addr2line命令。

在ndk目录下还看到了其他的addr2line不知道为什么用这两个而不用其他的,希望走过路过了解的朋友解答一下。

 

三、问题的切入点 beginning of crash、has died、DeadObjectException、No implementation found等

Logcat一般都比较大,不可能一行一行分析,一般是找到问题发生的时间点,然后根据一些错误的信息,往前分析。喔目前遇到的错误信息,以下几种。

1、beginning of crash

--------- beginning of crash
07-06 14:31:25.890 15931 15931 F libc    : Fatal signal 6 (SIGABRT), code -6 in tid 15931 (com.nextev.navi)

这个时候已已经发生了crash,找原因从这里往前找,写墓碑文件是往下找(就是第二条说的backtrace那里)。

有时候的崩溃打印不出来back trace,也就发查不到地址,这个时候只能继续分析logcat

2、has died

07-21 14:48:48.905  2464  3610 I ActivityManager: Process com.android.systemui (pid 2656) has died
07-21 14:48:48.905  2464  3610 D ActivityManager: cleanUpApplicationRecord -- 2656

这种时候进程已经死掉了,找原因往上找。

1、2都是说找crash或者进程死掉的地方,找原因就是下面的3、4

3、android.os.DeadObjectException

07-21 14:48:48.875  2464  2480 W BroadcastQueue: android.os.DeadObjectException
07-21 14:48:48.875  2464  2480 W BroadcastQueue:     at android.os.BinderProxy.transactNative(Native Method)

这是说有对象或者进程为已经死掉了,一般是指针为空造成的。

4、No implementation found

有接口的实现没有找到,一般会出现在jni里面,就是在java中声明,在c中实现的接口找不到。这个jni中c和java是怎么互相调用的。准备单独再写一篇文章,敬请期待。