当只有堆栈跟踪可用时,如何调试Android崩溃
我有一个应用程序偶尔会崩溃,我正在调试原因。我已经向logcat添加了调试信息,这些信息围绕着对发生崩溃的库的所有调用,但不幸的是,上次崩溃发生时,它在字段中,当我拿到设备时,我可以查看logcat,唯一仍然存在的是堆栈跟踪 我很难说出崩溃发生在我的代码中的什么地方,我正在寻找一些将堆栈跟踪号转换为(例如)代码中的行号的技巧 崩溃显然发生在“JavaBridge”中,前17帧(0-16)发生在我链接到的共享对象库“libsqlcipher.so”中。前16帧中的每一帧都只有一个地址,如“#00 pc 00000000000 88CF0”,但第17帧有一个损坏的名称“_zn9sqlcipher7compileeep7_JNIEnvP8_jobjectP7sqlite3P8_jstring+184”,我将其解释为源文件中的函数“compile”,尽管我不确定是哪一行。第18帧是另一个地址,在我的项目目录下引用“oat/arm64/base.odex”。我不确定堆栈跟踪为何在这里结束,因为我的应用程序没有直接调用compile() 以下是完整的堆栈跟踪:当只有堆栈跟踪可用时,如何调试Android崩溃,android,debugging,stack-trace,sqlcipher-android,Android,Debugging,Stack Trace,Sqlcipher Android,我有一个应用程序偶尔会崩溃,我正在调试原因。我已经向logcat添加了调试信息,这些信息围绕着对发生崩溃的库的所有调用,但不幸的是,上次崩溃发生时,它在字段中,当我拿到设备时,我可以查看logcat,唯一仍然存在的是堆栈跟踪 我很难说出崩溃发生在我的代码中的什么地方,我正在寻找一些将堆栈跟踪号转换为(例如)代码中的行号的技巧 崩溃显然发生在“JavaBridge”中,前17帧(0-16)发生在我链接到的共享对象库“libsqlcipher.so”中。前16帧中的每一帧都只有一个地址,如“#00
07-16 10:40:03.103 2967 6420 F libc : Fatal signal 7 (SIGBUS), code 2, fault addr 0x7007a1b000 in tid 6420 (JavaBridge)
07-16 10:40:03.229 15040 15040 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
07-16 10:40:03.229 15040 15040 F DEBUG : Build fingerprint: 'google/angler/angler:7.1.2/NXGXXB/XXXXXXX:user/release-keys'
07-16 10:40:03.229 15040 15040 F DEBUG : Revision: '0'
07-16 10:40:03.229 15040 15040 F DEBUG : ABI: 'arm64'
07-16 10:40:03.230 15040 15040 F DEBUG : pid: 2967, tid: 6420, name: JavaBridge >>> com.michael.test <<<
07-16 10:40:03.230 15040 15040 F DEBUG : signal 7 (SIGBUS), code 2 (BUS_ADRERR), fault addr 0x7007a1b000
07-16 10:40:03.230 15040 15040 F DEBUG : x0 290ccf38feaeb8f6 x1 0000000000000000 x2 0000006fdbbb0158 x3 0000000000000008
07-16 10:40:03.230 15040 15040 F DEBUG : x4 00000000000000a5 x5 0000000000000001 x6 0000000000000001 x7 0000007022acb074
07-16 10:40:03.230 15040 15040 F DEBUG : x8 0000000000000000 x9 0000000000000002 x10 0000000000000001 x11 0000000000000000
07-16 10:40:03.230 15040 15040 F DEBUG : x12 0000007004654640 x13 0000000000001a40 x14 000000000000000c x15 0000000000000000
07-16 10:40:03.230 15040 15040 F DEBUG : x16 0000007007d714e8 x17 0000007022ac9464 x18 0000000000ffffeb x19 0000007007a1b000
07-16 10:40:03.230 15040 15040 F DEBUG : x20 0000007007d71000 x21 00000070059057f4 x22 00000070059055f8 x23 0000006fdbd73788
07-16 10:40:03.230 15040 15040 F DEBUG : x24 0000007007ce1c60 x25 0000007007ce62c0 x26 0000000000000000 x27 0000007005905890
07-16 10:40:03.230 15040 15040 F DEBUG : x28 0000000000000000 x29 0000007005906df8 x30 0000007007b3236c
07-16 10:40:03.230 15040 15040 F DEBUG : sp 00000070059055c0 pc 0000007007afecf0 pstate 0000000080000000
07-16 10:40:03.249 15040 15040 F DEBUG :
07-16 10:40:03.249 15040 15040 F DEBUG : backtrace:
07-16 10:40:03.249 15040 15040 F DEBUG : #00 pc 0000000000088cf0 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #01 pc 00000000000bc368 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #02 pc 00000000000bc9d8 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #03 pc 00000000000da90c /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #04 pc 00000000000de684 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #05 pc 000000000011c708 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #06 pc 000000000011c840 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #07 pc 000000000011d934 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #08 pc 000000000011e378 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #09 pc 0000000000093478 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #10 pc 0000000000093ab4 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #11 pc 00000000000efff4 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #12 pc 000000000010b070 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #13 pc 0000000000110bd8 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #14 pc 0000000000111090 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #15 pc 0000000000140eb0 /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG : #16 pc 00000000001481ec /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so (_ZN9sqlcipher7compileEP7_JNIEnvP8_jobjectP7sqlite3P8_jstring+184)
07-16 10:40:03.250 15040 15040 F DEBUG : #17 pc 000000000006482c /data/app/com.michael.test-1/oat/arm64/base.odex (offset 0x53000)
07-16 10:40:03.103 2967 6420 F libc:tid 6420(JavaBridge)中的致命信号7(SIGBUS),代码2,故障地址0x7007a1b000
07-16 10:40:03.229 15040 15040 F调试:*********************************************************
07-16 10:40:03.229 15040 15040 F调试:构建指纹:“google/angler/angler:7.1.2/NXGXXB/XXXXXXX:user/release key”
07-16 10:40:03.229 15040 15040 F调试:修订版:“0”
07-16 10:40:03.229 15040 15040 F调试:ABI:'arm64'
07-16 10:40:03.230 15040 15040 F DEBUG:pid:2967,tid:6420,name:JavaBridge>>>com.michael.test您可以使用该工具调查在共享本机库中发生的此崩溃。您需要将工具指向共享库的符号版本所在的目录。然后地址将自动替换为源文件的行号。您可以使用该工具调查在共享本机库中发生的此崩溃。您需要将工具指向共享库的符号版本所在的目录。然后,地址将自动替换为源文件的行号。post the full stack traceAlso,+184是指令的字节偏移量。如果您有编译的目标文件,则可以将其转换为行号。但是你可以从完整的堆栈跟踪中获得更多的信息。例如,抛出了什么信号?这告诉我们发生了什么类型的错误。故障地址是什么?这可以告诉我们它是否可能是空指针、引用未初始化的内存或引用已释放的对象。等等@Gabeschen谢谢,我已经添加了完整的堆栈跟踪。所以Sig总线是无效的访问。错误地址就是无效地址,这里的错误地址高得离谱,但它不是人类可读的,所以不太可能成为内存管理的哨兵。我猜是一个未初始化的变量。考虑到该库的受欢迎程度,但我认为与库相比,您更可能(现在或以前)将其设置为无效值big@GabeSechan这也是我的想法。我认为,考虑到它发生的时间,它一定是在调用SQLite接口insertWithOnConflict
的过程中,该接口经常被调用。不确定无效值是如何进入的,或者它会是什么,所以现在我只记录每次传递的ContentValues。出于好奇,如果我用try/catch来包装这条线,它会抓住上面的内容吗?我不确定异常处理程序是否能捕捉到崩溃…在完整堆栈跟踪之后,+184是指令的字节偏移量。如果您有编译的目标文件,则可以将其转换为行号。但是你可以从完整的堆栈跟踪中获得更多的信息。例如,抛出了什么信号?这告诉我们发生了什么类型的错误。故障地址是什么?这可以告诉我们它是否可能是空指针、引用未初始化的内存或引用已释放的对象。等等@Gabeschen谢谢,我已经添加了完整的堆栈跟踪。所以Sig总线是无效的访问。错误地址就是无效地址,这里的错误地址高得离谱,但它不是人类可读的,所以不太可能成为内存管理的哨兵。我猜是一个未初始化的变量。考虑到该库的受欢迎程度,但我认为与库相比,您更可能(现在或以前)将其设置为无效值big@GabeSechan这也是我的想法。我认为,考虑到它发生的时间,它一定是在调用SQLite接口insertWithOnConflict
的过程中,该接口经常被调用。不确定无效值是如何进入的,或者它会是什么,所以现在我只记录每次传递的ContentValues。出于好奇,如果我用try/catch来包装这条线,它会抓住上面的内容吗?我不确定异常处理程序是否可以捕捉到崩溃。。。