Android JNI:root-caused deadd00d(dvmAbort)

ben*_*nkc 8 java-native-interface android

对一些StackOverflow问题的评论指出,deadd00d的故障地址表示故意的VM中止.

I DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
Run Code Online (Sandbox Code Playgroud)

事实上,当通过ndk-stack运行日志时,我看到堆栈帧的顶部解码为:

Stack frame #00  pc 00050b0e  /system/lib/libdvm.so (dvmAbort)
Run Code Online (Sandbox Code Playgroud)

然后评论说要在日志中查看问题.究竟我在寻找什么 - 是否有特定的标签或字符串可供搜索?(也许dalvikvm?)我滚动了很多页面的日志而没有找到任何相关的东西 - 这是正常的,还是应该在故障发生之前?

deadd00d最常发生在对GetObjectClass()的特定调用中.我试过在该行之前立即调用env-> ExceptionCheck,但它没有报告任何先前的错误.

我也试过打开CheckJNI

adb shell setprop debug.checkjni 1
Run Code Online (Sandbox Code Playgroud)

根据此处此处的说明,但在杀死并重新启动应用程序时,我看不到预期的消息

D Late-enabling CheckJNI
Run Code Online (Sandbox Code Playgroud)

反而

D AndroidRuntime: CheckJNI is OFF
Run Code Online (Sandbox Code Playgroud)

使用adb shell getprop表明该物业真的开启了,所以我不确定那里发生了什么.

小智 0

如果是本机崩溃,您可以搜索“b​​acktrace”,它会指出您的本机代码方法崩溃的位置,然后您应该分析这些方法,