例子一:
死机后拿到tombstones文件,看到 JNI ERROR (app bug): local reference table overflow (max=512)基本可以确认是JNI申请的某些local ref未释放导致的。
再往下看,有dalvikvm打印出来的信息,很多重复的 com.tcl.tvapi.model.DtvPvrEvent,这个说明是jni中申请的DtvPvrEvent的obj
的local ref没有释放导致,我用deletelocalref释放后此问题就解决了。
06-24 15:18:42.000 531 623 E dalvikvm: JNI ERROR (app bug): local reference table overflow (max=512)
06-24 15:18:42.000 531 623 W dalvikvm: JNI local reference table (0x785077b8) dump:06-24 15:18:42.000 531 623 W dalvikvm: Last 10 entries (of 512):
06-24 15:18:42.000 531 623 W dalvikvm: 511: 0x41e394d8 java.lang.String "EventNotify"
06-24 15:18:42.000 531 623 W dalvikvm: 510: 0x41abb0b8 java.lang.Class<android.util.Log>
06-24 15:18:42.000 531 623 W dalvikvm: 509: 0x420db918 com.tcl.tvapi.model.DtvPvrEvent
06-24 15:18:42.000 531 623 W dalvikvm: 508: 0x420d4cc8 com.tcl.tvapi.model.DtvPvrEvent
06-24 15:18:42.000 531 623 W dalvikvm: 507: 0x420c5010 com.tcl.tvapi.model.DtvPvrEvent
06-24 15:18:42.000 531 623 W dalvikvm: 506: 0x42010ef0 com.tcl.tvapi.model.DtvPvrEvent
06-24 15:18:42.000 531 623 W dalvikvm: 505: 0x41f20b68 com.tcl.tvapi.model.DtvPvrEvent
06-24 15:18:42.000 531 623 W dalvikvm: 504: 0x425cda48 com.tcl.tvapi.model.DtvPvrEvent
06-24 15:18:42.000 531 623 W dalvikvm: 503: 0x420aada0 com.tcl.tvapi.model.DtvPvrEvent
06-24 15:18:42.000 531 623 W dalvikvm: 502: 0x4204d898 com.tcl.tvapi.model.DtvPvrEvent
06-24 15:18:42.000 531 623 W dalvikvm: Summary:
06-24 15:18:42.000 531 623 W dalvikvm: 3 of java.lang.Class (3 unique instances)
06-24 15:18:42.000 531 623 W dalvikvm: 1 of java.lang.String
06-24 15:18:42.000 531 623 W dalvikvm: 508 of com.tcl.tvapi.model.DtvPvrEvent (508 unique instances)
06-24 15:18:42.000 531 623 E dalvikvm: Failed adding to JNI local ref table (has 512 entries)
06-24 15:18:42.000 531 623 I dalvikvm: "Thread-32" prio=6 tid=25 RUNNABLE
06-24 15:18:42.000 531 623 I dalvikvm: | group="main" sCount=0 dsCount=0 obj=0x41e9a178 self=0x730f9a48
06-24 15:18:42.000 531 623 I dalvikvm: | sysTid=623 nice=-2 sched=0/0 cgrp=[no-cpu-subsys] handle=19478948
例子二:
拿到tombstone文件分析:
这个例子中,报错的地方更明亮,dalvikvm直接指明了是com.tcl.factory.service.TService.native_doGetSnCode(Native Method)引起的死机。
01-01 00:00:17.540 526 1053 W dalvikvm: JNI WARNING: input is not valid Modified UTF-8: illegal continuation byte 0x55
01-01 00:00:17.540 526 1053 W dalvikvm: string: '2013129000001鉛'
01-01 00:00:17.540 526 1053 W dalvikvm: in Lcom/tcl/factory/service/TService;.native_doGetSnCode:()Ljava/lang/String; (NewStringUTF)
01-01 00:00:17.570 526 1053 I dalvikvm: "Binder_5" prio=5 tid=68 NATIVE
01-01 00:00:17.570 526 1053 I dalvikvm: | group="main" sCount=0 dsCount=0 obj=0x41f546b8 self=0x77bb1f10
01-01 00:00:17.570 526 1053 I dalvikvm: | sysTid=1053 nice=0 sched=0/0 cgrp=[no-cpu-subsys] handle=2001813616
01-01 00:00:17.570 526 1053 I dalvikvm: | state=R schedstat=( 0 0 0 ) utm=3 stm=0 core=1
01-01 00:00:17.580 526 1053 I dalvikvm: #00 pc 000012a0 /system/lib/libcorkscrew.so (unwind_backtrace_thread+27)
01-01 00:00:17.580 526 1053 I dalvikvm: #01 pc 0005fd08 /system/lib/libdvm.so (dvmDumpNativeStack(DebugOutputTarget const*, int)+35)
01-01 00:00:17.580 526 1053 I dalvikvm: #02 pc 00053b68 /system/lib/libdvm.so (dvmDumpThreadEx(DebugOutputTarget const*, Thread*, bool)+303)
01-01 00:00:17.580 526 1053 I dalvikvm: #03 pc 00053c02 /system/lib/libdvm.so (dvmDumpThread(Thread*, bool)+25)
01-01 00:00:17.580 526 1053 I dalvikvm: #04 pc 00038b7a /system/lib/libdvm.so
01-01 00:00:17.580 526 1053 I dalvikvm: #05 pc 00039f38 /system/lib/libdvm.so
01-01 00:00:17.580 526 1053 I dalvikvm: #06 pc 0003c196 /system/lib/libdvm.so
01-01 00:00:17.580 526 1053 I dalvikvm: #07 pc 000109c6 /tvos/mid_base/lib/libcom_tcl_tv_jni.so
01-01 00:00:17.580 526 1053 I dalvikvm: #08 pc 0001e290 /system/lib/libdvm.so (dvmPlatformInvoke+112)
01-01 00:00:17.580 526 1053 I dalvikvm: #09 pc 0004d410 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+395)
01-01 00:00:17.580 526 1053 I dalvikvm: #10 pc 00038c04 /system/lib/libdvm.so (dvmCheckCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+7)
01-01 00:00:17.580 526 1053 I dalvikvm: #11 pc 000276a0 /system/lib/libdvm.so
01-01 00:00:17.580 526 1053 I dalvikvm: #12 pc 0002b57c /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
01-01 00:00:17.580 526 1053 I dalvikvm: #13 pc 0005fc34 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+271)
01-01 00:00:17.580 526 1053 I dalvikvm: #14 pc 0004cab4 /system/lib/libdvm.so
01-01 00:00:17.580 526 1053 I dalvikvm: #15 pc 00040ae2 /system/lib/libdvm.so
01-01 00:00:17.580 526 1053 I dalvikvm: #16 pc 0004a376 /system/lib/libandroid_runtime.so
01-01 00:00:17.580 526 1053 I dalvikvm: #17 pc 0006786e /system/lib/libandroid_runtime.so
01-01 00:00:17.580 526 1053 I dalvikvm: #18 pc 0001435e /system/lib/libbinder.so (android::BBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+57)
01-01 00:00:17.580 526 1053 I dalvikvm: #19 pc 00016f5a /system/lib/libbinder.so (android::IPCThreadState::executeCommand(int)+513)
01-01 00:00:17.580 526 1053 I dalvikvm: #20 pc 00017380 /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+183)
01-01 00:00:17.580 526 1053 I dalvikvm: #21 pc 0001b1f4 /system/lib/libbinder.so
01-01 00:00:17.580 526 1053 I dalvikvm: #22 pc 00011264 /system/lib/libutils.so (android::Thread::_threadLoop(void*)+111)
01-01 00:00:17.580 526 1053 I dalvikvm: #23 pc 0004795c /system/lib/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+63)
01-01 00:00:17.580 526 1053 I dalvikvm: #24 pc 00010dca /system/lib/libutils.so
01-01 00:00:17.580 526 1053 I dalvikvm: #25 pc 0000e518 /system/lib/libc.so (__thread_entry+72)
01-01 00:00:17.580 526 1053 I dalvikvm: #26 pc 0000dc04 /system/lib/libc.so (pthread_create+160)
01-01 00:00:17.580 526 1053 I dalvikvm: at com.tcl.factory.service.TService.native_doGetSnCode(Native Method)
01-01 00:00:17.580 526 1053 I dalvikvm: at com.tcl.factory.service.TService.doGetSnCode(TService.java:320)
01-01 00:00:17.580 526 1053 I dalvikvm: at com.tcl.factory.IService$Stub.onTransact(IService.java:310)
01-01 00:00:17.580 526 1053 I dalvikvm: at android.os.Binder.execTransact(Binder.java:351)
01-01 00:00:17.580 526 1053 I dalvikvm: at dalvik.system.NativeStart.run(Native Method)