我有一个偶尔会崩溃的应用,而我正试图调试原因。我已经将logcat的调试信息添加到发生崩溃的库的所有调用中,但不幸的是,最后一次崩溃发生时它是在现场,当我得到设备到达我可以查看logcat的地方时唯一仍然存在堆栈跟踪。
我很难在我的代码中告知崩溃发生的位置,并且正在寻找有关将堆栈跟踪号转换为代码中的(例如)行号的一些提示。
崩溃显然发生在" JavaBridge"前17帧(0-16)发生在我链接的共享对象库中," libsqlcipher.so"。前16帧中的每一帧只有一个地址,例如"#00 pc 0000000000088cf0"但是第17帧有一个错误的名字" _ZN9sqlcipher7compileEP7_JNIEnvP8_jobjectP7sqlite3P8_jstring + 184"我将其解释为函数" compile"在this源文件中,虽然我不确定哪一行。第18帧是另一个地址,引用" oat / arm64 / base.odex"在我的项目目录下。我不确定为什么堆栈跟踪在这里结束,因为我的应用程序没有直接调用compile()。
这是完整的堆栈跟踪:
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)
显然共享对象库中的框架不会包含行号,但是从给定的地址开始,如何在我自己的代码中找到崩溃发生的行?
更新: 我将每个调用包含在sqlcipher库中,并带有代码,以便在调用进行之前记录有关SD卡的调用的详细信息。几天之后发生了下一次崩溃,我立即发现......当发生崩溃时,这些呼叫都没有激活(超过2秒!)。
我还尝试在Android Studio中调试应用程序,试图了解上述数字对应的内容,但是...... Android Studio没有列出每个堆栈帧的PC,并且它不会进入上面的本机代码甚至包括&#34; Force Step Into&#34;。