完美无缺的代码逻辑,一定能产生完美无缺的程序吗?答案是否定的。从软件的层面来看,也许只有二进制才永远不会欺骗你。
现象
近期,业务方反馈了一个奇怪的崩溃问题,认为信息不足,无法解决。
Signal: 11 (SIGSEGV), Code: 1 (SEGV_MAPERR), fault addr 0x1
r0 993ff520 r1 dc3170c4 r2 00000000 r3 dabe3e08
r4 993ff520 r5 00000005 r6 00000290 r7 000007ac
r8 e83253a0 r9 00006aba r10 bf921e39 r11 e83253a0
ip bfa3a9e0 sp 993ff494 lr bf88a71d pc bf96c31c
#00 pc 001a731c /data/data/com.package.name/files/download/libmcto_media_player.so
#01 pc 0020b7e5 /data/data/com.package.name/files/download/libmcto_media_player.so
#00 993ff494 0000022c
993ff498 adcfd000 [anon:libc_malloc]
993ff49c bf88a71d /data/data/com.package.name/files/download/libmcto_media_player.so
993ff4a0 ffffffff
993ff4a4 ffffffff
993ff4a8 bf9d07e7 /data/data/com.package.name/files/download/libmcto_media_player.so
#01 993ff4ac 00000000
993ff4b0 00000000
993ff4b4 00000000
993ff4b8 00000000
993ff4bc 00000000
993ff4c0 adcfd234 [anon:libc_malloc]
993ff4c4 00000000
993ff4c8 0000006e
993ff4cc 00000000
993ff4d0 adcfdf6c [anon:libc_malloc]
993ff4d4 00000000
993ff4d8 00000000
993ff4dc 00000000
993ff4e0 00000000
993ff4e4 00000000
993ff4e8 00000000
复制代码
第一感觉这肯定是动态库的业务逻辑有 bug,导致了段错误。backtrace 确实是不完整的,但一下也看不出为什么不完整,确实需要协助分析一下。
分析
backtrace 不完整的常见原因
backtrace 不完整的情况时有发生,常见的原因有:
- 崩溃时 stack 内存被大量误写。如果崩溃点附近的逻辑正在处理的外部输入随机性很大,情况就更加糟糕,往往会看到大量离散的不完整 backtrace。举例:
#00 pc 00000ffb <anonymous:c34fe000>
#01 pc 0009a885 /data/app/com.package.name-1/lib/arm/libjsc.so
#02 pc 0003ff93 /data/app/com.package.name-1/lib/arm/libjsc.so
#03 pc 0011f60f /data/app/com.package.name-1/lib/arm/libjsc.so
#04 pc fffffffb <unknown>
复制代码
#00 pc 000092fe <anonymous:c15d0000>
#01 pc 00099ec3 /data/app/com.package.name-1/lib/arm/libjsc.so
#02 pc 00003ffe <anonymous:bf140000>
复制代码
#00 pc 00000ffb <anonymous:ef304000>
复制代码
- 调用路径上的某些 ELF 文件的 unwind table 不完整。比如某些系统的 odex/oat,还有系统的 WebView Chromium,都属于此类。举例:
#00 pc 00d12bcc /system/lib/libwebviewchromium.so
复制代码
#00 pc 01a0cf72 /system/app/WebViewGoogle/WebViewGoogle.apk!libwebviewchromium.so (offset 0x46da000)
复制代码
#00 pc 00006fde /data/app/com.package.name-1/lib/arm/libcros.so
#01 pc 00007007 /data/app/com.package.name-1/lib/arm/libcros.so
#02 pc 00007023 /data/a