java - 如何在 Java 代码中获取崩溃点

标签 java android android-ndk dalvik addr2line

我的应用程序只有 android-support-v4.jar/libs 中。我不使用其他库。

我的应用程序因 SIGNAL 11 错误而崩溃。我想使用 android-ndk 的 addr2line 实用程序。 我们可以使用这个工具找到 java 文件的函数和行号吗?任何帮助在这里都会很有帮助

我的应用程序正在写入到蓝牙套接字,在我关闭套接字之间我怀疑,错误是因为write()在 socket 的 close() 之后被调用但是我无法找到 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 中的 native 堆栈跟踪中获取用 Java 编程语言编写的代码的堆栈跟踪,原因很简单,Dalvik 对 native 堆栈和托管堆栈使用不同的内存 fragment 。 (我相信有可能从 Art 崩溃中得到它,因为 Art 使用共享堆栈,但不能肯定地说。)

错误地址表明空指针取消引用,通过jniGetFDFromFileDescriptor() 的调用表明文件 Activity 。您可以查看该方法的源代码 here .我猜它是在空对象上调用 GetIntField,这与您的怀疑相符。

Enabling CheckJNI可能有帮助——如果 JNI 检查器发现问题,它通常会在终止 VM 之前将当前线程的堆栈跟踪转储到日志文件。

关于java - 如何在 Java 代码中获取崩溃点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30093772/

相关文章:

java while 循环计数不正确

java - SQL查询速度: multiple queries vs sorting within Java

java - Rabbitmq header 交换和确认交付

android - 游标的复制构造函数?

android - 使用 BindingAdapter 时数据绑定(bind)器无法识别 lambda 中的类型化参数

java - 将 unsigned char* 作为 byte[] 从 C++ 传递到 java 的最有效方法

android - Android 平台上是否有 OpenGL ES 2.0 的 java 绑定(bind)?

java - 如何使用匹配的 DER 私钥解密 PEM 公钥加密字节数组?

c++ - std::experimental::与ndk/clang一起使用

java - 如何显示 firebase 数据库中的所有标记?