Fatal signal XX (SIGSEGV)常用解决思路
****例如:****
1、log信息: (摘自网络)
02-13 14:56:12.140 6180 11596 F libc : Fatal signal 6 (SIGABRT), code -6 in tid 11596 (pool_albumlabel)
02-13 14:56:12.149 4549 4579 D ForegroundUtils: Process died; UID 1000 PID 7721
02-13 14:56:12.149 4549 4579 D ForegroundUtils: Foreground changed, PID: 7721 UID: 1000 foreground: false
02-13 14:56:12.149 4549 4579 D ForegroundUtils: Foreground UID/PID combinations:
02-13 14:56:12.149 4549 4579 D ForegroundUtils: UID: 10031 PID: 6180
02-13 14:56:12.154 6180 11587 E wwf5 : onDrawFrame end
02-13 14:56:12.171 6180 11587 E wwf5 : onDrawFrame end
02-13 14:56:12.185 6180 11587 E wwf5 : onDrawFrame end
02-13 14:56:12.189 298 399 I ThermalEngine: Sensor:tsens_tz_sensor6:77000 mC
02-13 14:56:12.208 275 275 I DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
02-13 14:56:12.208 275 275 I DEBUG : Build fingerprint: ‘Lenovo/kingdom_row/kingdom_row:5.0.2/LRX22G/K920_S205_150205_ROW:eng/release-keys’
02-13 14:56:12.208 275 275 I DEBUG : Revision: ‘0’
02-13 14:56:12.208 275 275 I DEBUG : ABI: ‘arm’
02-13 14:56:12.208 275 275 I DEBUG : pid: 6180, tid: 11596, name: pool_albumlabel >>> com.xxxx.scg <<<
02-13 14:56:12.208 275 275 I DEBUG : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
02-13 14:56:12.245 275 275 I DEBUG : r0 00000000 r1 00002d4c r2 00000006 r3 00000000
02-13 14:56:12.245 275 275 I DEBUG : r4 777cddb8 r5 00000006 r6 0000000c r7 0000010c
02-13 14:56:12.245 275 275 I DEBUG : r8 00000004 r9 00000cc0 sl 00000000 fp 00000000
02-13 14:56:12.245 275 275 I DEBUG : ip 00002d4c sp 777cb338 lr b6f510a1 pc b6f7404c cpsr 600f0010
02-13 14:56:12.245 275 275 I DEBUG :
02-13 14:56:12.245 275 275 I DEBUG : backtrace:
02-13 14:56:12.245 275 275 I DEBUG : #00 pc 0003704c /system/lib/libc.so (tgkill+12)
02-13 14:56:12.245 275 275 I DEBUG : #01 pc 0001409d /system/lib/libc.so (pthread_kill+52)
02-13 14:56:12.245 275 275 I DEBUG : #02 pc 00014cbb /system/lib/libc.so (raise+10)
02-13 14:56:12.245 275 275 I DEBUG : #03 pc 00011511 /system/lib/libc.so (__libc_android_abort+36)
02-13 14:56:12.245 275 275 I DEBUG : #04 pc 0000fc94 /system/lib/libc.so (abort+4)
02-13 14:56:12.246 275 275 I DEBUG : #05 pc 0014a1e7 /system/lib/libskia.so (sk_throw()+2)
02-13 14:56:12.246 275 275 I DEBUG : #06 pc 0014a21d /system/lib/libskia.so (sk_malloc_flags(unsigned int, unsigned int)+20)
02-13 14:56:12.246 275 275 I DEBUG : #07 pc 000dd0a5 /system/lib/libskia.so
02-13 14:56:12.246 275 275 I DEBUG : #08 pc 0013b3d5 /system/lib/libskia.so (SkPNGImageDecoder::onDecodeSubset(SkBitmap*, SkIRect const&)+604)
2、主要有用信息是带有 #xx 的这些东西,这是出错信息的执行过程,从#XX—>#0。我们目的就是将这些东西定位到源码中的相应代码行去分析。
02-13 14:56:12.245 275 275 I DEBUG : #00 pc 0003704c /system/lib/libc.so (tgkill+12)
02-13 14:56:12.245 275 275 I DEBUG : #01 pc 0001409d /system/lib/libc.so (pthread_kill+52)
02-13 14:56:12.245 275 275 I DEBUG : #02 pc 00014cbb /system/lib/libc.so (raise+10)
02-13 14:56:12.245 275 275 I DEBUG : #03 pc 00011511 /system/lib/libc.so (__libc_android_abort+36)
02-13 14:56:12.245 275 275 I DEBUG : #04 pc 0000fc94 /system/lib/libc.so (abort+4)
02-13 14:56:12.246 275 275 I DEBUG : #05 pc 0014a1e7 /system/lib/libskia.so (sk_throw()+2)
02-13 14:56:12.246 275 275 I DEBUG : #06 pc 0014a21d /system/lib/libskia.so (sk_malloc_flags(unsigned int, unsigned int)+20)
02-13 14:56:12.246 275 275 I DEBUG : #07 pc 000dd0a5 /system/lib/libskia.so
02-13 14:56:12.246 275 275 I DEBUG : #08 pc 0013b3d5 /system/lib/libskia.so (SkPNGImageDecoder::onDecodeSubset(SkBitmap*, SkIRect const&)+604)
3、首先看#8,将其定位到源码。
02-13 14:56:12.246 275 275 I DEBUG : #08 pc 0013b3d5 /system/lib/libskia.so (SkPNGImageDecoder::onDecodeSubset(SkBitmap*, SkIRect const&)+604)
3.1、在Ubuntu系统可以直接使用addr2line。
3.2:倘若没有addr2line,可使用android自带的 *addr2line
a、find -name addr2line,找到很多路径
b、vi ~/.bashrc 添加 : export PATH=$PATH: ~/…/…/…/…/bin/ (想要使用的addr2line的路径)
c 、source .bashrc
3.3、 在自己电脑的out目录下找到 libskia.so 文件 : find -name libskia.so
a、 会出现很多:
./product/kingdom_row/obj/lib/libskia.so
./product/kingdom_row/obj/SHARED_LIBRARIES/libskia_intermediates/LINKED/libskia.so
./product/kingdom_row/obj/PACKAGING/target_files_intermediates/kingdom_row-target_files-K920_S204_150127_ROW/SYSTEM/lib/libskia.so
./product/kingdom_row/obj/PACKAGING/target_files_intermediates/kingdom_row-target_files-K920_S205_150205_ROW/SYSTEM/lib/libskia.so
./product/kingdom_row/symbols/system/lib/libskia.so
./product/kingdom_row/system/lib/libskia.so
b、 使用目录中含有:symbol 的那一个。
切换到该目录下:
./product/kingdom_row/symbols/system/lib/libskia.so
c、执行 addr2line或者x86_64-linux-addr2line -e libskia.so 0013b3d5
显示:
/home/xxx/qcom8974_l_row/LINUX/android/external/skia/src/images/SkImageDecoder_libpng.cpp: 528
表示# 8 的错误出现下 SkImageDecoder_libpng.cpp 文件中的 第528 行。
d、命令解析:
addr2line或者x86_64-linux-addr2line: 取决于你添加路径时选取的*addr2line,有的可用,有的不可用。
-e :指定映像对象
libskia.so:#xx 后面的库文件
0013b3d5 :#xx 后面的库文件的指令地址
4、同理根据上述步骤查找#8——>#0,追踪源码,一般出现问题在#0,问题类型一般也是内存泄漏,空指针的,可以打log进行测试分析。
文章参考:
1:Android中使用addr2line来分析native信息
http://blog.csdn.net/whz_zb/article/details/7604760
2:Fatal signal 11问题的解决方法
http://blog.csdn.net/tankai19880619/article/details/9004619
3:Android Tombstone/Crash的log分析和定位
http://blog.csdn.net/helldevil/article/details/6682211