不久前的项目中,调用so库时出现了tombstone,但最初看打印时却满是雾,措手不及。 但是,后来分析的结果表明,log信息清楚地说明了问题。

01-062233605336044.02976547654 f debug : * * * * * * * * * * * * * * * * * * * * * * * * *。 01-0622336055336044.02976547654 f debug : build fingerprint : ‘ hid pt/hi 3751 v 811 _ DMO/hi 3751 v 811:8.0.0/oo release-keys ‘ 01-062233605336044.02976547654 f debug : revision : ‘0’ 01-062233605:44.0297654 f debug 33654 f 0606 60PID:7634、tid: 7634、 name : com.Android.TP com.Android.tp01-062233605336044.0297654 f debug : siga BRT ) code-6 ) si fault addr ug : abort message 3360 ‘ fortify 3360 write : prevented 21 buffer ‘ 01-062233605336044.03276547654 f debug : x 00000000000000000 0000000000000006 x 30000000000000000000000000000000000000000000000000000000000003.03276547654 f debug : x 40000000000000000000000000 000 x 6000000000000 x 700000000000000001801-0623360536044 f debug 3360 x 8000000000000083 x 90 ca 59 D5 ff cfae c84 x 1000000000000000000000000000004 622:5336044.0337654 f debug 7654 fffffffffffffffx 13000000000001 x 140039 a 3410 b 62 D6 c0x 15000000000177 a6 aaaadac 01-0622233606 360 x 1600000044 x 170000007658 A8 e 5d0x 1800000000000000020 x 19000000000000000000001 d d 201-0622:5336044.0337654 f debug : x 2000000000000000000000000000 22000007 Fe6ff2F8 CX 23000000763 ee 752 DD 01-06223360536044.0337654 f debug 3360 x 24000000000000000 x 250000000000000000000 x2ff2f 25008 bea 98 bea 98 36044.03376547654 f debug 3360 x 280000007 Fe6ff2ce0x 2900000007 Fe6ff26 c0x 300000007658 a 4000000008 36055:44.0376547654 f debug 33333333 0000007658 A8 e 5d8 pstate 000000006000001-062233605336044.25466657665 tbroadcastservicedmr : timer expire==3501-0622222222226 tbroadcastservicedmr 3360 sleep 1000 fornet 5:44.28066807045 emedia service : timer expire==3501-06223360536044.266807044

654 F DEBUG : 01-06 22:55:44.437 7654 7654 F DEBUG : backtrace:01-06 22:55:44.437 7654 7654 F DEBUG : #00 pc 00000000000695d8 /system/lib64/libc.so (tgkill+8)01-06 22:55:44.437 7654 7654 F DEBUG : #01 pc 000000000001d990 /system/lib64/libc.so (abort+88)01-06 22:55:44.437 7654 7654 F DEBUG : #02 pc 00000000000253b4 /system/lib64/libc.so (__fortify_fatal+120)01-06 22:55:44.437 7654 7654 F DEBUG : #03 pc 0000000000021568 /system/lib64/libc.so (__write_chk+104)01-06 22:55:44.437 7654 7654 F DEBUG : #04 pc 00000000000015d8 /system/app/AutoTest/lib/arm64/libtouchuart_fac.so (InitVirtualInput+88)01-06 22:55:44.437 7654 7654 F DEBUG : #05 pc 0000000000002e7c /system/app/AutoTest/lib/arm64/libtouchuart_fac.so (Java_com_android_tp_TouchNative_setup+216)01-06 22:55:44.437 7654 7654 F DEBUG : #06 pc 000000000050ff00 /system/lib64/libart.so (art_quick_generic_jni_trampoline+144)01-06 22:55:44.437 7654 7654 F DEBUG : #07 pc 0000000000506e38 /system/lib64/libart.so (art_quick_invoke_static_stub+600)01-06 22:55:44.437 7654 7654 F DEBUG : #08 pc 00000000000d804c /system/lib64/libart.so (_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+260)01-06 22:55:44.437 7654 7654 F DEBUG : #09 pc 0000000000281bbc /system/lib64/libart.so (_ZN3art11interpreter34ArtInterpreterToCompiledCodeBridgeEPNS_6ThreadEPNS_9ArtMethodEPKNS_7DexFile8CodeItemEPNS_11ShadowFrameEPNS_6JValueE+352)01-06 22:55:44.437 7654 7654 F DEBUG : #10 pc 000000000027c284 /system/lib64/libart.so (_ZN3art11interpreter6DoCallILb0ELb0EEEbPNS_9ArtMethodEPNS_6ThreadERNS_11ShadowFrameEPKNS_11InstructionEtPNS_6JValueE+672)01-06 22:55:44.437 7654 7654 F DEBUG : #11 pc 00000000004ef868 /system/lib64/libart.so (MterpInvokeStatic+468)01-06 22:55:44.437 7654 7654 F DEBUG : #12 pc 00000000004f8614 /system/lib64/libart.so (ExecuteMterpImpl+14612)

看到这样一大坨打印是有些烦躁,但只需要抓取我们需要的部分。

01-06 22:55:44.029  7654  7654 F DEBUG   : pid: 7634, tid: 7634, name: com.android.tp  >>> com.android.tp <<<

==>这里是指发生tombstone的pid,以及包名。
01-06 22:55:44.029  7654  7654 F DEBUG   : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr ——–
01-06 22:55:44.032  7654  7654 F DEBUG   : Abort message: ‘FORTIFY: write: prevented 21-byte read from 18-byte buffer’

==》这个地方表明发生了中断,另外注意’FORTIFY: write: prevented 21-byte read from 18-byte buffer’,这句是后面解决问题的关键。那么究竟是哪个地方要阻止从18个字节读取20个字节呢?继续往下看,发现我所使用so库的名称。

01-06 22:55:44.437  7654  7654 F DEBUG   :     #04 pc 00000000000015d8  /system/app/AutoTest/lib/arm64/libtouchuart_fac.so (InitVirtualInput+88)
01-06 22:55:44.437  7654  7654 F DEBUG   :     #05 pc 0000000000002e7c  /system/app/AutoTest/lib/arm64/libtouchuart_fac.so (Java_com_android_tp_TouchNative_setup+216)

这个so库正是我项目中使用的,我们通过add2line这个工具来定位出问题代码的位置。进入系统代码so库所在位置:

/out/target/product/Hi3751V811/symbols/system/lib64# addr2line -f -e libtouchuart.so 0x00000000000015d8InitVirtualInputlib_tp_uart.c:0/out/target/product/Hi3751V811/symbols/system/lib64# addr2line -f -e libtouchuart.so 0x0000000000002e7c_send_uinput_eventTp_uart.c:389

注意是要在symbos目录下进行该操作,不然在system目录下会出现解不出来的情况

addr2line -f -e  libtouchuart_fac.so 0x00000000000015d8
??
??:0

上面已经定位出了出问题的地方,查看so库的源码,很容易就看出问题所在

write(input_fd,”open /dev/uinput\n”,21);

这里实际的长度是18,但是传入的参数却是21,所以开头那句打印FORTIFY: write: prevented 21-byte read from 18-byte buffer已经说明原因了。这里最好使用sizeof来获取长度,即可避免问题。

总结:

         本文主要是记录下解决tombstone问题的大概思路。因为是调用自己的so库,所以问题还比较容易定位。