当发生NE时,可以通过addr2line来辅助定位发生点。
举个例子
Exception Class: Native (NE)
Exception Type: SIGABRT
Current Executing Process:
pid: 3971, tid: 4118
com.android.nfc
Backtrace:
#00 pc 000000000006d658 /system/lib64/libc.so (tgkill+8)
#01 pc 000000000006aa78 /system/lib64/libc.so (pthread_kill+64)
#02 pc 000000000002409c /system/lib64/libc.so (raise+24)
#03 pc 000000000001c8bc /system/lib64/libc.so (abort+52)
#04 pc 000000000001ea88 /system/lib64/libnfc_nci_jni.so
#05 pc 00000000000db890 /system/lib64/libart.so (art_quick_generic_jni_trampoline+144)
#06 pc 00000000000d22b4 /system/lib64/libart.so (art_quick_invoke_stub+580)
#07 pc 00000000000def7c /system/lib64/libart.so (_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+208)
#08 pc 000000000028e2cc /system/lib64/libart.so (_ZN3art11interpreter34ArtInterpreterToCompiledCodeBridgeEPNS_6ThreadEPNS_9ArtMethodEPKNS_7DexFile8CodeItemEPNS_11ShadowFrameEPNS_6JValueE+312)
#09 pc 00000000002872b8 /system/lib64/libart.so (_ZN3art11interpreter6DoCallILb0ELb0EEEbPNS_9ArtMethodEPNS_6ThreadERNS_11ShadowFrameEPKNS_11InstructionEtPNS_6JValueE+596)
#10 pc 0000000000557fac /system/lib64/libart.so (MterpInvokeInterface+1188)
#11 pc 00000000000c4e94 /system/lib64/libart.so (ExecuteMterpImpl+14740)
$** *** *** *** *** *** *** *** Exception *** *** *** *** *** *** *** **$
Android工程源码prebuilt目录下有很多addr2line指令,使用其中一个即可。
user@swd3:/local/sdb/xxx/out/target/product/elsa6p/symbols$ find . -name libnfc_nci_jni.so
./system/lib64/libnfc_nci_jni.so
user@swd3:/local/sdb/xxx/out/target/product/elsa6p/symbols$
user@swd3:/local/sdb/xxx/out/target/product/elsa6p/symbols$ ../../../../../prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.1
x86_64-linux-glibc2.11-4.8/ x86_64-linux-glibc2.15-4.8/
user@swd3:/local/sdb/xxx/out/target/product/elsa6p/symbols$ ../../../../../prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/bin/x86_64-linux-addr2line -e ./system/lib64/libnfc_nci_jni.so 000000000001ea88
/proc/self/cwd/packages/apps/Nfc/nci/jni/NativeNfcManager.cpp:4152
注:
这里对应的so库一定得是同份代码编出的symbols目录下的,否则及时得到行数也是无效的。
对应的代码段
Code No.1
以上方法是JAVA层代码主动调用的,详见下方代码。
Code No.2
再看看watchdog的代码
Code No.3
由上面可知,WatchDog是个单独的线程,它会阻塞timeout时长,如果在timeout内未执行calcel()方法,将会按照顺序执行doAbort()方法,即发生此NE。
换据话说,以上Code No.2中try-catch内部如若在timeout时长内未执行完毕,则发生以上NE。