1. Java Crash FATAL EXCEPTION,常见的严重错误有如下几类:
NullPointerException: 空对象错误
IllegalStateException:非法状态,比如在View没有刷出来的时候去触摸。
IndexOutOfBoundsException
IllegalArgumentException
ExceptionInInitializerError
ClassCastException
RuntimeException
UnknownFormatConversionException
UnsupportContentTypeException
CursorIndexOutOfBoundsException
2.ANR
ANR是一种常见的严重错误,在logcat中会直接给出造成ANR的原因,例如:
11-01 18:16:15.966 E/ActivityManager( 344): ANR in com.android.systemui
11-01 18:16:15.966 E/ActivityManager( 344): Reason: Broadcast of Intent { act=android.intent.action.TIME_TICK flg=0x40000014 (has extras) }
以上这个ANR就是由BroadcastTimeout引起的。
常见的ANR原因有如下:
KeyDispatchTimeout(5 seconds) Key事件响应超时
BroadcastTimeout(10 seconds) BroadcastReceiver超时
ServiceTimeout(20 seconds) Service超时
当ANR发生时,我们可以在/data/anr/下面发现响应的trace.txt里面会有ANR的callstack,有助于我们定位问题。
3. Tombstone
tombstone一般是由Dalvik错误、状态监视调试器、C层代码以及libc的一些问题导致的。当系统发生tombstone的时候,kernel首先会上报一个严重的警告信号(serious signal),上层接收到之后,进程的调试工具会把进程中当时的调用栈现场保存起来,并在系统创建了data/tombstones目录后把异常时的进程信息写在此目录里面,开发者需要通过调用栈来分析整个调用流程来找出出问题的点。
这里主要介绍一下常用的分析步骤:
a. 首先查看日志文件,搜索"SEGV_MAPERR" 或者 "SEGV_ACCERR",
注: SEGV_MAPERR地址没有映射到对象,SEGV_ACCERR对映射的对象没有权限
例如:
pid: 122, tid: 14745, name: Binder_2 >>> /system/bin/mediaserver <<<signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000058 eax 00000000 ebx 41bbf784 ecx 00000000 edx 00000009 esi 450578f0 edi 40378054 xcs 00000073 xds 0000007b xes 0000007b xfs 00000000 xss 0000007b eip 4088a5c2 ebp 45e15cb8 esp 45e15ca0 flags 00010297
b. 再看backtrace
#00 pc 000085c2 /system/lib/libcameraservice.so (android::CameraHardwareInterface::__set_buffer_count(preview_stream_ops*, int)+34)
#01 pc 0003b6fa /system/lib/hw/camera.XXXX.so (android::PreviewThread::allocateGfxPreviewBuffers(int)+154)
#02 pc 0003ce83 /system/lib/hw/camera.XXXX.so (android::PreviewThread::threadLoop()+1203)
#03 pc 0001a2bc /system/lib/libutils.so (android::Thread::_threadLoop(void*)+556)
#04 pc 0000dda8 /system/lib/libc.so (__thread_entry+248)
#05 pc 0001b031 /system/lib/libc.so #06 pc 00001f2c /system/lib/libc.so
从这段log来看,发现问题发生时,出错的lib为libcameraservice.so。
c. 如果需要进一步分析,需要动用symbol文件,具体步骤这次就不详述了。
4. Memory Leak
在Logcat输出中,会出现
E/AndroidRuntime(1112):Caused by: java.lang.OutOfMemoryError: bitmap sizeexceeds VM budget
E/AndroidRuntime(1112):at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
E/AndroidRuntime(1112):at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:447)
E/AndroidRuntime(1112):at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323)
E/AndroidRuntime(1112):
这里1112是进程的pid,代表出现OOM的应用。如果需要详细分析,一般来说需要先制造出来hprof文件,详细做法请参考Memaory debug。
5. Kernel Panic
通过demsg命令可以查看到内核log输出。查找kernel panic和Bug等字样就能找到。
NullPointerException: 空对象错误
IllegalStateException:非法状态,比如在View没有刷出来的时候去触摸。
IndexOutOfBoundsException
IllegalArgumentException
ExceptionInInitializerError
ClassCastException
RuntimeException
UnknownFormatConversionException
UnsupportContentTypeException
CursorIndexOutOfBoundsException
2.ANR
ANR是一种常见的严重错误,在logcat中会直接给出造成ANR的原因,例如:
11-01 18:16:15.966 E/ActivityManager( 344): ANR in com.android.systemui
11-01 18:16:15.966 E/ActivityManager( 344): Reason: Broadcast of Intent { act=android.intent.action.TIME_TICK flg=0x40000014 (has extras) }
以上这个ANR就是由BroadcastTimeout引起的。
常见的ANR原因有如下:
KeyDispatchTimeout(5 seconds) Key事件响应超时
BroadcastTimeout(10 seconds) BroadcastReceiver超时
ServiceTimeout(20 seconds) Service超时
当ANR发生时,我们可以在/data/anr/下面发现响应的trace.txt里面会有ANR的callstack,有助于我们定位问题。
3. Tombstone
tombstone一般是由Dalvik错误、状态监视调试器、C层代码以及libc的一些问题导致的。当系统发生tombstone的时候,kernel首先会上报一个严重的警告信号(serious signal),上层接收到之后,进程的调试工具会把进程中当时的调用栈现场保存起来,并在系统创建了data/tombstones目录后把异常时的进程信息写在此目录里面,开发者需要通过调用栈来分析整个调用流程来找出出问题的点。
这里主要介绍一下常用的分析步骤:
a. 首先查看日志文件,搜索"SEGV_MAPERR" 或者 "SEGV_ACCERR",
注: SEGV_MAPERR地址没有映射到对象,SEGV_ACCERR对映射的对象没有权限
例如:
pid: 122, tid: 14745, name: Binder_2 >>> /system/bin/mediaserver <<<signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000058 eax 00000000 ebx 41bbf784 ecx 00000000 edx 00000009 esi 450578f0 edi 40378054 xcs 00000073 xds 0000007b xes 0000007b xfs 00000000 xss 0000007b eip 4088a5c2 ebp 45e15cb8 esp 45e15ca0 flags 00010297
b. 再看backtrace
#00 pc 000085c2 /system/lib/libcameraservice.so (android::CameraHardwareInterface::__set_buffer_count(preview_stream_ops*, int)+34)
#01 pc 0003b6fa /system/lib/hw/camera.XXXX.so (android::PreviewThread::allocateGfxPreviewBuffers(int)+154)
#02 pc 0003ce83 /system/lib/hw/camera.XXXX.so (android::PreviewThread::threadLoop()+1203)
#03 pc 0001a2bc /system/lib/libutils.so (android::Thread::_threadLoop(void*)+556)
#04 pc 0000dda8 /system/lib/libc.so (__thread_entry+248)
#05 pc 0001b031 /system/lib/libc.so #06 pc 00001f2c /system/lib/libc.so
从这段log来看,发现问题发生时,出错的lib为libcameraservice.so。
c. 如果需要进一步分析,需要动用symbol文件,具体步骤这次就不详述了。
4. Memory Leak
在Logcat输出中,会出现
E/AndroidRuntime(1112):Caused by: java.lang.OutOfMemoryError: bitmap sizeexceeds VM budget
E/AndroidRuntime(1112):at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
E/AndroidRuntime(1112):at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:447)
E/AndroidRuntime(1112):at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323)
E/AndroidRuntime(1112):
这里1112是进程的pid,代表出现OOM的应用。如果需要详细分析,一般来说需要先制造出来hprof文件,详细做法请参考Memaory debug。
5. Kernel Panic
通过demsg命令可以查看到内核log输出。查找kernel panic和Bug等字样就能找到。