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是怎么互相调用的。准备单独再写一篇文章,敬请期待。