对许多 StackOverflow 问题的评论指出,deadd00d 的故障地址表示 VM 故意中止。
I DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
事实上,当通过 ndk-stack 运行日志时,我看到堆栈帧的顶部解码为:
Stack frame #00 pc 00050b0e /system/lib/libdvm.so (dvmAbort)
然后评论说要在您的日志中更早地查看问题。我到底在寻找什么——是否有特定的标签或字符串要搜索?(也许是dalvikvm?)我滚动浏览了很多页的日志,但没有找到任何相关的东西——这正常吗,还是应该在故障发生之前?
deadd00d 最常发生在对 GetObjectClass() 的特定调用中。我曾尝试在该行之前立即调用 env->ExceptionCheck ,但它没有报告任何先前的错误。
我也试过打开 CheckJNI
adb shell setprop debug.checkjni 1
根据此处和此处的说明,但是在杀死并重新启动应用程序时,我没有看到预期的消息
D Late-enabling CheckJNI
反而
D AndroidRuntime: CheckJNI is OFF
Usingadb shell getprop
表示该属性确实已打开,因此我不确定那里发生了什么。