如何在 Java 代码中获取崩溃点
How to get Crash Point in Java code
我的应用程序只有 /libs 中有 android-support-v4.jar
。我不使用其他库。
我的应用程序因 SIGNAL 11 错误而崩溃。我想使用 android-ndk 的 addr2line 实用程序。 我们可以使用这个工具找到 java 文件的功能和行号吗? 任何帮助在这里都会很有帮助
我的应用程序是 writing
到蓝牙套接字,在我关闭 socket
之间我怀疑,错误是因为 write()
在 close()
之后被调用socket 但我无法找到 crash 的确切行或功能我如何检查我做错了什么
Logcat 跟踪:
D/CrashAnrDetector(831): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000008
D/CrashAnrDetector(831): r0 00000000 r1 00000002 r2 00000008 r3 7a0efef0
D/CrashAnrDetector(831): r4 6d6a4800 r5 00000000 r6 4025df88 r7 00000000
D/CrashAnrDetector(831): r8 7b1d6b10 r9 791d3cc4 sl 79265220 fp 7b1d6b24
D/CrashAnrDetector(831): ip 401f004c sp 7b1d6ac8 lr 4172f41f pc 4172f426 cpsr 600f0030
D/CrashAnrDetector(831): d0 0000000000000000 d1 0000000000000000
D/CrashAnrDetector(831): d2 0000000000000000 d3 0000000000000000
D/CrashAnrDetector(831): d4 0100000000000000 d5 0000001000020000
D/CrashAnrDetector(831): d6 3e4ccccd01fe1000 d7 400000004bfb9b10
D/CrashAnrDetector(831): d8 0000000000000000 d9 0000000000000000
D/CrashAnrDetector(831): d10 0000000000000000 d11 0000000000000000
D/CrashAnrDetector(831): d12 0000000000000000 d13 0000000000000000
D/CrashAnrDetector(831): d14 0000000000000000 d15 0000000000000000
D/CrashAnrDetector(831): d16 0064006e00650073 d17 002e0067006e0069
D/CrashAnrDetector(831): d18 006f006900730072 d19 00310027003d006e
D/CrashAnrDetector(831): d20 002000270030002e d21 006f0063006e0065
D/CrashAnrDetector(831): d22 0067006e00690064 d23 007400750027003d
D/CrashAnrDetector(831): d24 0031003200320031 d25 0036003500340033
D/CrashAnrDetector(831): d26 0000000000000000 d27 0000000000000000
D/CrashAnrDetector(831): d28 001e001d001c001b d29 0020001f001d001e
D/CrashAnrDetector(831): d30 0036003600360036 d31 0000000000000000
D/CrashAnrDetector(831): scr 80000013
D/CrashAnrDetector(831): backtrace:
D/CrashAnrDetector(831): #00 pc 0004f426 /system/lib/libdvm.so
D/CrashAnrDetector(831): #01 pc 00001dad /system/lib/libnativehelper.so (jniGetFDFromFileDescriptor+80)
D/CrashAnrDetector(831): #02 pc 00075d11 /system/lib/libandroid_runtime.so
D/CrashAnrDetector(831): #03 pc 00020e4c /system/lib/libdvm.so (dvmPlatformInvoke+112)
D/CrashAnrDetector(831): #04 pc 00051aef /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
D/CrashAnrDetector(831): #05 pc 00000214 /dev/ashmem/dalvik-jit-code-cache (deleted)
您无法从 Dalvik VM 的本机堆栈跟踪中获取使用 Java 编程语言编写的代码的堆栈跟踪,原因很简单,Dalvik 为本机使用不同的内存片段和托管堆栈。 (我相信有可能从 Art 崩溃中获取它,因为 Art 使用共享堆栈,但不能肯定地说。)
故障地址提示空指针解引用,通过jniGetFDFromFileDescriptor()
调用表示文件activity。您可以查看该方法的源代码 here。我猜它是在空对象上调用 GetIntField
,这与您的怀疑相符。
Enabling CheckJNI 可能会有所帮助——如果 JNI 检查器发现问题,它通常会在终止 VM 之前将当前线程的堆栈跟踪转储到日志文件中。
我的应用程序只有 /libs 中有 android-support-v4.jar
。我不使用其他库。
我的应用程序因 SIGNAL 11 错误而崩溃。我想使用 android-ndk 的 addr2line 实用程序。 我们可以使用这个工具找到 java 文件的功能和行号吗? 任何帮助在这里都会很有帮助
我的应用程序是 writing
到蓝牙套接字,在我关闭 socket
之间我怀疑,错误是因为 write()
在 close()
之后被调用socket 但我无法找到 crash 的确切行或功能我如何检查我做错了什么
Logcat 跟踪:
D/CrashAnrDetector(831): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000008
D/CrashAnrDetector(831): r0 00000000 r1 00000002 r2 00000008 r3 7a0efef0
D/CrashAnrDetector(831): r4 6d6a4800 r5 00000000 r6 4025df88 r7 00000000
D/CrashAnrDetector(831): r8 7b1d6b10 r9 791d3cc4 sl 79265220 fp 7b1d6b24
D/CrashAnrDetector(831): ip 401f004c sp 7b1d6ac8 lr 4172f41f pc 4172f426 cpsr 600f0030
D/CrashAnrDetector(831): d0 0000000000000000 d1 0000000000000000
D/CrashAnrDetector(831): d2 0000000000000000 d3 0000000000000000
D/CrashAnrDetector(831): d4 0100000000000000 d5 0000001000020000
D/CrashAnrDetector(831): d6 3e4ccccd01fe1000 d7 400000004bfb9b10
D/CrashAnrDetector(831): d8 0000000000000000 d9 0000000000000000
D/CrashAnrDetector(831): d10 0000000000000000 d11 0000000000000000
D/CrashAnrDetector(831): d12 0000000000000000 d13 0000000000000000
D/CrashAnrDetector(831): d14 0000000000000000 d15 0000000000000000
D/CrashAnrDetector(831): d16 0064006e00650073 d17 002e0067006e0069
D/CrashAnrDetector(831): d18 006f006900730072 d19 00310027003d006e
D/CrashAnrDetector(831): d20 002000270030002e d21 006f0063006e0065
D/CrashAnrDetector(831): d22 0067006e00690064 d23 007400750027003d
D/CrashAnrDetector(831): d24 0031003200320031 d25 0036003500340033
D/CrashAnrDetector(831): d26 0000000000000000 d27 0000000000000000
D/CrashAnrDetector(831): d28 001e001d001c001b d29 0020001f001d001e
D/CrashAnrDetector(831): d30 0036003600360036 d31 0000000000000000
D/CrashAnrDetector(831): scr 80000013
D/CrashAnrDetector(831): backtrace:
D/CrashAnrDetector(831): #00 pc 0004f426 /system/lib/libdvm.so
D/CrashAnrDetector(831): #01 pc 00001dad /system/lib/libnativehelper.so (jniGetFDFromFileDescriptor+80)
D/CrashAnrDetector(831): #02 pc 00075d11 /system/lib/libandroid_runtime.so
D/CrashAnrDetector(831): #03 pc 00020e4c /system/lib/libdvm.so (dvmPlatformInvoke+112)
D/CrashAnrDetector(831): #04 pc 00051aef /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
D/CrashAnrDetector(831): #05 pc 00000214 /dev/ashmem/dalvik-jit-code-cache (deleted)
您无法从 Dalvik VM 的本机堆栈跟踪中获取使用 Java 编程语言编写的代码的堆栈跟踪,原因很简单,Dalvik 为本机使用不同的内存片段和托管堆栈。 (我相信有可能从 Art 崩溃中获取它,因为 Art 使用共享堆栈,但不能肯定地说。)
故障地址提示空指针解引用,通过jniGetFDFromFileDescriptor()
调用表示文件activity。您可以查看该方法的源代码 here。我猜它是在空对象上调用 GetIntField
,这与您的怀疑相符。
Enabling CheckJNI 可能会有所帮助——如果 JNI 检查器发现问题,它通常会在终止 VM 之前将当前线程的堆栈跟踪转储到日志文件中。