Android 4.4 本机代码崩溃,与应用程序代码没有任何可见关系
Android 4.4 native code crash without any visible relation to app code
我们有一个 Android 应用程序,主要是用 Java 编写的,但使用基于 OpenCV 库的小型本机模块进行图像处理。
模块由 JNI 调用,其方法中的所有代码都在 try-catch 块中,该块应捕获任何异常。
现在我们很少(大约每千名用户一次)遇到让我们非常困惑的本机崩溃。我们无法复制那些崩溃。它总是在 Android 4.4.2 或 4.4.4 上,但很少能重现。它似乎与我们的代码没有任何关系。回溯中没有 .so 文件可以暗示它可能是什么。我们不知道崩溃何时发生,用户不会 post 对崩溃发表有用的评论。
我们怎么可能开始调试这样的东西呢?能查出是什么原因吗?
典型的崩溃报告:
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'samsung/s3ve3gxx/s3ve3g:4.4.2/KOT49H/I9301IXXSAPG5:user/release-keys'
Revision: '4'
pid: 11950, tid: 11950
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
r0 00000000 r1 00002eae r2 00000006 r3 00000000
r4 00000006 r5 00000002 r6 00002eae r7 0000010c
r8 a080001d r9 6d596a34 sl 415ef4d8 fp beca92d4
ip 4163fb21 sp beca8ff8 lr 40064205 pc 40073164 cpsr 000f0010
d0 0000000000000000 d1 0000000000000000
d2 0000000000000000 d3 0000000000000000
d4 4391240843912408 d5 4391240843912408
d6 4391240843912408 d7 4391240843912408
d8 0000000000000000 d9 000005003f000000
d10 3f00000000000038 d11 4044000000000000
d12 4044000000000000 d13 0000000000000029
d14 0000000000000000 d15 0000000000000000
d16 2065766974614e28 d17 0a29646f6874654d
d18 4391240843912408 d19 4391240843912408
d20 4391240843912408 d21 4391240843912408
d22 4391240843912408 d23 4391240843912408
d24 004e004d004c004b d25 0050004f004d004e
d26 0000000000000000 d27 0000000000000000
d28 001e001d001c001b d29 0020001f001d001e
d30 0050005000500050 d31 0000000000000000
scr 88000013
backtrace:
#00 pc 00022164 /system/lib/libc.so (tgkill+12)
#01 pc 00013201 /system/lib/libc.so (pthread_kill+48)
#02 pc 00013415 /system/lib/libc.so (raise+10)
#03 pc 000120e3 /system/lib/libc.so
#04 pc 00021a18 /system/lib/libc.so (abort+4)
#05 pc 000494ff /system/lib/libdvm.so (dvmAbort+78)
#06 pc 0004ccfd /system/lib/libdvm.so
#07 pc 0004eb3b /system/lib/libdvm.so
#08 pc 0006ab23 /system/lib/libandroid_runtime.so
#09 pc 00020d0c /system/lib/libdvm.so (dvmPlatformInvoke+112)
#10 pc 000519af /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
#11 pc 0002a1a0 /system/lib/libdvm.so
#12 pc 00031650 /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
#13 pc 0002ece8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#14 pc 000640f9 /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+392)
#15 pc 0006c05f /system/lib/libdvm.so
#16 pc 0002a1a0 /system/lib/libdvm.so
#17 pc 00031650 /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
#18 pc 0002ece8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#19 pc 00063e15 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+336)
#20 pc 0004d597 /system/lib/libdvm.so
#21 pc 000520e7 /system/lib/libandroid_runtime.so
#22 pc 0005367f /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*, bool)+358)
#23 pc 00001063 /system/bin/app_process
#24 pc 0000e503 /system/lib/libc.so (__libc_init+50)
#25 pc 00000d80 /system/bin/app_process
code around pc:
40073144 e8bd00f0 e3700a01 912fff1e e2600000
40073154 ea006e48 e92d50f0 e3a07f43 ef000000
40073164 e8bd50f0 e3700a01 912fff1e e2600000
40073174 ea006e40 e92d50f0 e3a070ee ef000000
40073184 e8bd50f0 e3700a01 912fff1e e2600000
40073194 ea006e38 f200429a bf0080b9 f040f891
400731a4 4001e92d f2c02a04 2a1080a5 8093f2c0
400731b4 f2c02a20 2a408088 ea4fdb7f f1bc1c92
400731c4 dd6c0f0a 0600e92d 0f40f1bc f500dd4a
400731d4 f5016e80 ebae7920 ea4f0e09 ea4f5e4e
400731e4 f50e5e5e ebbc7e20 dd3b1f9e f04fbfc4
400731f4 ebd9090a dd35199e 0a0eeb01 0a3ff02a
40073204 1c9eebac bfd245e1 0c09ebac f04f46e1
40073214 f8910c00 f891f240 f921f280 f921028d
40073224 f8da428d f1b93000 f9000901 f900028d
40073234 f10a428d d1ee0a40 0f00f1bc f5bcd02b
code around lr:
400641e4 447b4b13 42b3e010 6a1ed10e 44784811
400641f4 ec50f7fb e9e8f00d 46224631 efaaf00e
40064204 d00a3001 e00b2400 2b00681b 480ad1eb
40064214 44782403 ec3ef7fb f001e002 6804f9ff
40064224 f9fcf001 46206005 bf00bd70 0003b1d2
40064234 0003b1c6 0003b1be 0003b19a bf7ef7ff
40064244 4a3e4b3d e92d447b b08b43f0 4606589c
40064254 6823460d 930946a1 f9e0f001 8000f8d0
40064264 d0482d00 f0104628 280ff8f7 d8444604
40064274 ffe4f7ff d1064286 4629200f e8b2f00d
40064284 d03c2800 482ee02e f7fb4478 482deb82
40064294 e0154478 d11342b0 482b6a06 f7fb4478
400642a4 4a2aebfa 46332120 a801447a f96ef013
400642b4 a8012101 fc8cf01a 46061c42 e011d104
400642c4 28006800 e02cd1e6 46294630 f00d4622
400642d4 1c43e8ee d11e4607 f9a0f001 29046801
这可能是 Android 用户 运行 的实现中的错误,或者是 code/opencv 使用 JNI 的方式中的错误。这对 SO 人员来说很难调试,因为我们的信息比你少,但这里有一些尝试追踪它的建议:
- 在与拥有
问题。
- 用很多 images/data 进行测试,因为这可能是格式问题或大小问题
触发故障的问题。
- 通过更改相关 OS 设置(如 ART)进行测试。
- 通过做一些用户可能会做的事情来测试,比如在横屏和横屏之间切换
纵向模式,就像应用程序正在处理大图像一样。
- 在 JNI 调用周围放置一些工具来审计事情
比如图片的大小和格式。想办法获取这些信息,这个SO Question给出一些建议。
没有关于 why/when 的信息,它崩溃了,你无法重现,没有重现你就无法修复它。
我们有一个 Android 应用程序,主要是用 Java 编写的,但使用基于 OpenCV 库的小型本机模块进行图像处理。
模块由 JNI 调用,其方法中的所有代码都在 try-catch 块中,该块应捕获任何异常。
现在我们很少(大约每千名用户一次)遇到让我们非常困惑的本机崩溃。我们无法复制那些崩溃。它总是在 Android 4.4.2 或 4.4.4 上,但很少能重现。它似乎与我们的代码没有任何关系。回溯中没有 .so 文件可以暗示它可能是什么。我们不知道崩溃何时发生,用户不会 post 对崩溃发表有用的评论。
我们怎么可能开始调试这样的东西呢?能查出是什么原因吗?
典型的崩溃报告:
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'samsung/s3ve3gxx/s3ve3g:4.4.2/KOT49H/I9301IXXSAPG5:user/release-keys'
Revision: '4'
pid: 11950, tid: 11950
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
r0 00000000 r1 00002eae r2 00000006 r3 00000000
r4 00000006 r5 00000002 r6 00002eae r7 0000010c
r8 a080001d r9 6d596a34 sl 415ef4d8 fp beca92d4
ip 4163fb21 sp beca8ff8 lr 40064205 pc 40073164 cpsr 000f0010
d0 0000000000000000 d1 0000000000000000
d2 0000000000000000 d3 0000000000000000
d4 4391240843912408 d5 4391240843912408
d6 4391240843912408 d7 4391240843912408
d8 0000000000000000 d9 000005003f000000
d10 3f00000000000038 d11 4044000000000000
d12 4044000000000000 d13 0000000000000029
d14 0000000000000000 d15 0000000000000000
d16 2065766974614e28 d17 0a29646f6874654d
d18 4391240843912408 d19 4391240843912408
d20 4391240843912408 d21 4391240843912408
d22 4391240843912408 d23 4391240843912408
d24 004e004d004c004b d25 0050004f004d004e
d26 0000000000000000 d27 0000000000000000
d28 001e001d001c001b d29 0020001f001d001e
d30 0050005000500050 d31 0000000000000000
scr 88000013
backtrace:
#00 pc 00022164 /system/lib/libc.so (tgkill+12)
#01 pc 00013201 /system/lib/libc.so (pthread_kill+48)
#02 pc 00013415 /system/lib/libc.so (raise+10)
#03 pc 000120e3 /system/lib/libc.so
#04 pc 00021a18 /system/lib/libc.so (abort+4)
#05 pc 000494ff /system/lib/libdvm.so (dvmAbort+78)
#06 pc 0004ccfd /system/lib/libdvm.so
#07 pc 0004eb3b /system/lib/libdvm.so
#08 pc 0006ab23 /system/lib/libandroid_runtime.so
#09 pc 00020d0c /system/lib/libdvm.so (dvmPlatformInvoke+112)
#10 pc 000519af /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
#11 pc 0002a1a0 /system/lib/libdvm.so
#12 pc 00031650 /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
#13 pc 0002ece8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#14 pc 000640f9 /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+392)
#15 pc 0006c05f /system/lib/libdvm.so
#16 pc 0002a1a0 /system/lib/libdvm.so
#17 pc 00031650 /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
#18 pc 0002ece8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#19 pc 00063e15 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+336)
#20 pc 0004d597 /system/lib/libdvm.so
#21 pc 000520e7 /system/lib/libandroid_runtime.so
#22 pc 0005367f /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*, bool)+358)
#23 pc 00001063 /system/bin/app_process
#24 pc 0000e503 /system/lib/libc.so (__libc_init+50)
#25 pc 00000d80 /system/bin/app_process
code around pc:
40073144 e8bd00f0 e3700a01 912fff1e e2600000
40073154 ea006e48 e92d50f0 e3a07f43 ef000000
40073164 e8bd50f0 e3700a01 912fff1e e2600000
40073174 ea006e40 e92d50f0 e3a070ee ef000000
40073184 e8bd50f0 e3700a01 912fff1e e2600000
40073194 ea006e38 f200429a bf0080b9 f040f891
400731a4 4001e92d f2c02a04 2a1080a5 8093f2c0
400731b4 f2c02a20 2a408088 ea4fdb7f f1bc1c92
400731c4 dd6c0f0a 0600e92d 0f40f1bc f500dd4a
400731d4 f5016e80 ebae7920 ea4f0e09 ea4f5e4e
400731e4 f50e5e5e ebbc7e20 dd3b1f9e f04fbfc4
400731f4 ebd9090a dd35199e 0a0eeb01 0a3ff02a
40073204 1c9eebac bfd245e1 0c09ebac f04f46e1
40073214 f8910c00 f891f240 f921f280 f921028d
40073224 f8da428d f1b93000 f9000901 f900028d
40073234 f10a428d d1ee0a40 0f00f1bc f5bcd02b
code around lr:
400641e4 447b4b13 42b3e010 6a1ed10e 44784811
400641f4 ec50f7fb e9e8f00d 46224631 efaaf00e
40064204 d00a3001 e00b2400 2b00681b 480ad1eb
40064214 44782403 ec3ef7fb f001e002 6804f9ff
40064224 f9fcf001 46206005 bf00bd70 0003b1d2
40064234 0003b1c6 0003b1be 0003b19a bf7ef7ff
40064244 4a3e4b3d e92d447b b08b43f0 4606589c
40064254 6823460d 930946a1 f9e0f001 8000f8d0
40064264 d0482d00 f0104628 280ff8f7 d8444604
40064274 ffe4f7ff d1064286 4629200f e8b2f00d
40064284 d03c2800 482ee02e f7fb4478 482deb82
40064294 e0154478 d11342b0 482b6a06 f7fb4478
400642a4 4a2aebfa 46332120 a801447a f96ef013
400642b4 a8012101 fc8cf01a 46061c42 e011d104
400642c4 28006800 e02cd1e6 46294630 f00d4622
400642d4 1c43e8ee d11e4607 f9a0f001 29046801
这可能是 Android 用户 运行 的实现中的错误,或者是 code/opencv 使用 JNI 的方式中的错误。这对 SO 人员来说很难调试,因为我们的信息比你少,但这里有一些尝试追踪它的建议:
- 在与拥有 问题。
- 用很多 images/data 进行测试,因为这可能是格式问题或大小问题 触发故障的问题。
- 通过更改相关 OS 设置(如 ART)进行测试。
- 通过做一些用户可能会做的事情来测试,比如在横屏和横屏之间切换 纵向模式,就像应用程序正在处理大图像一样。
- 在 JNI 调用周围放置一些工具来审计事情 比如图片的大小和格式。想办法获取这些信息,这个SO Question给出一些建议。
没有关于 why/when 的信息,它崩溃了,你无法重现,没有重现你就无法修复它。