Android ClassLoader.loadClass JNI崩溃

时间:2016-02-18 12:50:28

标签: android crash dalvik

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
  #00  pc 0x50f8e  /system/lib/libdvm.so (dvmAbort+89)
  #01  pc 0x59ee1  /system/lib/libdvm.so (dvmLinearAlloc(Object*, unsigned int)+64)
  #02  pc 0x76a7b  /system/lib/libdvm.so (???)
  #03  pc 0x76d77  /system/lib/libdvm.so (dvmDefineClass(DvmDex*, char const*, Object*)+10)
  #04  pc 0x71583  /system/lib/libdvm.so (???)
  #05  pc 0x30c0c  /system/lib/libdvm.so (???)
  #06  pc 0x343dc  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
  #07  pc 0x6d109  /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+284)
  #08  pc 0x6d12d  /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+20)
  #09  pc 0x76e69  /system/lib/libdvm.so (dvmFindClassNoInit(char const*, Object*)+108)
  #10  pc 0x6216b  /system/lib/libdvm.so (???)
  #11  pc 0x62287  /system/lib/libdvm.so (???)
  #12  pc 0x65a6d  /system/lib/libdvm.so (dvmVerifyCodeFlow(VerifierData*)+9760)
  #13  pc 0x68c91  /system/lib/libdvm.so (???)
  #14  pc 0x68ce3  /system/lib/libdvm.so (dvmVerifyClass(ClassObject*)+42)
  #15  pc 0x7704d  /system/lib/libdvm.so (dvmInitClass+116)
  #16  pc 0x742d1  /system/lib/libdvm.so (???)
  #17  pc 0x30c0c  /system/lib/libdvm.so (???)
  #18  pc 0x343dc  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
  #19  pc 0x6ce39  /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+344)
  #20  pc 0x73b19  /system/lib/libdvm.so (???)
  #21  pc 0x30c0c  /system/lib/libdvm.so (???)
  #22  pc 0x343dc  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
  #23  pc 0x6ce39  /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+344)
  #24  pc 0x7431b  /system/lib/libdvm.so (???)
  #25  pc 0x30c0c  /system/lib/libdvm.so (???)
  #26  pc 0x343dc  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
  #27  pc 0x6d109  /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+284)
  #28  pc 0x554af  /system/lib/libdvm.so (???)
  #29  pc 0x48c6b  /system/lib/libandroid_runtime.so (???)
  #30  pc 0x4a81f  /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+394)
  #31  pc 0xf0d  /system/bin/app_process (???)
java.lang.Throwable: 
******* Java stack for JNI crash *******
    at dalvik.system.DexFile.defineClass(Native Method)
    at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:195)
    at dalvik.system.DexPathList.findClass(DexPathList.java:315)
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:58)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.lily.dexLoader.invokeStaticMethod(SourceFile:70)
    at com.lily.sdk.Web.<init>(SourceFile:77)

...

我无法通过我的Android应用程序重现此崩溃,但监控系统多次报告此类崩溃。

目前尚不清楚dex是否破裂或系统dalvik是否不稳定。

有没有人对这种loadClass崩溃有任何经验?

1 个答案:

答案 0 :(得分:2)

如果VM检测到严重问题,它会将诊断信息发送到日志,然后中止。您正在使用的Android版本中的VM通过尝试写入只读位置(0xdeadd00d)而崩溃。

查看堆栈跟踪,dvmAbort()之前的最后一件事是dvmLinearAlloc()。查看a recent source file,如果虚拟机内存不足以进行分配,或者如果在特殊调试模式下页面被主动标记为只读,则VM将无法更改页面上的权限。这几乎可以肯定是前者。查看logcat输出肯定会告诉你。

假设你的内存不足,我猜你正在运行一个旧版本的Android(&lt; = gingerbread),其中“linear alloc”缓冲区的大小不足。这个内存区域用于保存类元数据,例如方法和字段表,但不包括数据本身(这就是为什么它可以被标记为只读以帮助寻找内存跟踪器)。避免问题的唯一方法是重组类。

您可以在this blog post中详细了解该问题以及Facebook工程师部署的解决方案。