在移植Android过程中会遇到很多Crash的情况,尤其是启动Android过程中。
一般这些问题都可以通过看代码能解决,当然也有一些比较“妖娆”的问题,
非常难找到头绪,在logcat日志也只会打印一些崩溃的堆栈,这些信息很难
帮助我们定位问题。
首先先看一下我遇到的一个logcat关于Crash的打印信息:
如:
F/libc ( 142): Fatal signal 11 (SIGSEGV)at 0xb256f000 (code=2), thread 1781 (OMXCallbackDisp)
I/DEBUG ( 137): *** *** *** *** *** ****** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 137): Build fingerprint:'generic/ardbeg/ardbeg:4.3/JSS15J/eng.yanyang.20131223.092431:eng/test-keys'
I/DEBUG ( 137): Revision: '0'
I/DEBUG ( 137): pid: 142, tid: 1781,name: OMXCallbackDisp >>>/system/bin/mediaserver <<<
I/DEBUG ( 137): signal 11 (SIGSEGV), code2 (SEGV_ACCERR), fault addr b256f000
W/NativeCrashListener( 597): Couldn't find ProcessRecord for pid 142
I/DEBUG ( 137): r0 b256f000 r1 b2378000 r2 ffe093e7 r3 00000000
I/DEBUG ( 137): r4 00000000 r5 001f6ff0 r6 b23784e4 r7 000004e0
I/DEBUG ( 137): r8 b2378008 r9 b68afb63 sl ffffffff fp ffffffff
I/DEBUG ( 137): ip c0000000 sp b276eca8 lr b683f4fd pc b6e46f4c cpsr a00d0010
I/DEBUG ( 137): d0 ffffffffffffffff d1 ffffffffffffffff
I/DEBUG ( 137): d2 ffffffffffffff68 d3 ffffffffffffff20
I/DEBUG ( 137): d4 000000000000000c d5 00000000000024c7
I/DEBUG ( 137): d6 3f115304c906e15c d7 00000000ae74f745
I/DEBUG ( 137): d8 0000000000000000 d9 0000000000000000
I/DEBUG ( 137): d10 0000000000000000 d11 0000000000000000
I/DEBUG ( 137): d12 0000000000000000 d13 0000000000000000
I/DEBUG ( 137): d14 0000000000000000 d15 0000000000000000
I/DEBUG ( 137): d16 000000000007a120 d17 000000000000000f
I/DEBUG ( 137): d18 0000000000000000 d19 3fc668957b800000
I/DEBUG ( 137): d20 3fc5528bb2399beb d21 3e66376972bea4d0
I/DEBUG ( 137): d22 3fc5c149e20e5f98 d23 3fe0000000000000
I/DEBUG ( 137): d24 3ffd47d6c3be340d d25 3f90a630b3499dc0
I/DEBUG ( 137): d26 4019868341953dcc d27 4000000000000000
I/DEBUG ( 137): d28 bf90a630b690dba7 d29 bfc87d5b92521b75
I/DEBUG ( 137): d30 3ff0000000000000 d31 3fe30fab724a436f
I/DEBUG ( 137): scr 60000010
I/DEBUG ( 137):
I/DEBUG ( 137): backtrace:
I/DEBUG ( 137): #00 pc 0001cf4c /system/lib/libc.so(memcpy+412)
I/DEBUG (137): #01 pc 0006a4f9 /system/lib/libstagefright.so (android::MPEG4Source::read(android::MediaBuffer**,android::MediaSource::ReadOptions const*)+2136)
I/DEBUG ( 137): #02 pc 00081e0d /system/lib/libstagefright.so(android::OMXCodec::drainInputBuffer(android::OMXCodec::BufferInfo*)+484)
I/DEBUG (137): #03 pc 0008631d /system/lib/libstagefright.so(android::OMXCodec::on_message(android::omx_message const&)+384)
I/DEBUG ( 137): #04 pc 000867d1 /system/lib/libstagefright.so
I/DEBUG ( 137): #05 pc 0000fadb /system/lib/libstagefright_omx.so (android::OMXNodeInstance::onMessage(android::omx_messageconst&)+86)
I/DEBUG ( 137): #06 pc 0000dc53 /system/lib/libstagefright_omx.so(android::OMX::CallbackDispatcher::loop()+90)
I/DEBUG ( 137): #07 pc 000119e5 /system/lib/libutils.so (android::Thread::_threadLoop(void*)+216)
I/DEBUG ( 137): #08 pc 000114d9 /system/lib/libutils.so
I/DEBUG ( 137): #09 pc 0000ca90 /system/lib/libc.so(__thread_entry+72)
I/DEBUG ( 137): #10 pc 0000cc0c /system/lib/libc.so(pthread_create+208)
I/DEBUG ( 137):
I/DEBUG ( 137): stack:
I/DEBUG ( 137): b276ec68 b276ec8c [stack:1781]
I/DEBUG ( 137): b276ec6c 00000000
I/DEBUG ( 137): b276ec70 00003bb3
I/DEBUG ( 137): b276ec74 b682c809 /system/lib/libstagefright.so
I/DEBUG ( 137): b276ec78 0b604b60
I/DEBUG ( 137): b276ec7c b683cf1d /system/lib/libstagefright.so (android::MPEG4DataSource::readAt(longlong, void*, unsigned int)+112)
I/DEBUG ( 137): b276ec80 b2181008
I/DEBUG ( 137): b276ec84 000b1e48
I/DEBUG ( 137): b276ec88 b8a4ae70 [heap]
I/DEBUG ( 137): b276ec8c b8a4a32c [heap]
I/DEBUG ( 137): b276ec90 b8a4ae5c [heap]
I/DEBUG ( 137): b276ec94 b8a48da8 [heap]
I/DEBUG ( 137): b276ec98 000b1e48
I/DEBUG ( 137): b276ec9c 99d517c6
I/DEBUG ( 137): b276eca0 df0027ad
I/DEBUG ( 137): b276eca4 00000000
I/DEBUG ( 137): #00 b276eca8 b8a48da8 [heap]
I/DEBUG ( 137): b276ecac ffffffff
I/DEBUG ( 137): b276ecb0 b23784e8
I/DEBUG ( 137): b276ecb4 b683f4fd /system/lib/libstagefright.so(android::MPEG4Source::read(android::MediaBuffer**,android::MediaSource::ReadOptions const*)+2140)
解决过程:
1、 Fatal代表出现了错误。
2、 backtrack 中可以查找pc
3、
4、 查找pc0x0006a4f9
5、 到out路径下,查找libstagefright.so文件所在的路径
out/target/product/ardbeg/obj/SHARED_LIBRARIES/libstagefright_intermediates/LINKED
6、输入: addr2line –e./libstagefright.so 0x0006a4f9 即可找到该文件在哪行出错。
7 同样的,也可以用lr pc 在模块中查找