WebView兼容问题分析报告

【NE现场】

pid: 6715, tid: 6719, name: Signal Catcher >>> com.android.contacts <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x55a5931480
x0 00000000000d4000 x1 0000007f98f9d868 x2 0000000000004001 x3 0000007f951f4450
x4 00000000000000ca x5 0000000000004001 x6 0000000000000000 x7 0000007f98f9d86c
x8 0000000000001a3f x9 0000000000001a3f x10 0000007f98f9d86c x11 0000000000004000
x12 0000000000004001 x13 0000000000000000 x14 0000000000000001 x15 0000000000000fc0
x16 0000007f98f90a58 x17 0000000000000000 x18 0000000000000fc0 x19 0000007f97457000
x20 0000007f98f9df18 x21 00000055a5931460 x22 0000007f951f3420 x23 00000055a585d460
x24 0000007f951f3428 x25 00000000000000ca x26 0000000000000001 x27 0000007f951f3338
x28 0000007f8abba350 x29 0000007f951f3290 x30 0000007f97434788
sp 0000007f951f3290 pc 0000007f974347b0 pstate 0000000060000000
backtrace:
#00 pc 00000000000077b0 /system/lib64/libunwind.so
#01 pc 0000000000007cf4 /system/lib64/libunwind.so (_ULaarch64_dwarf_find_debug_frame+320)
#02 pc 0000000000008244 /system/lib64/libunwind.so
#03 pc 0000000000003868 /system/bin/linker64 (_dlZ18do_dl_iterate_phdrPFiP12dl_phdr_infomPvES1+96)
#04 pc 0000000000003324 /system/bin/linker64 (__dl_dl_iterate_phdr+44)
#05 pc 00000000000085b8 /system/lib64/libunwind.so
#06 pc 00000000000062c0 /system/lib64/libunwind.so
#07 pc 00000000000071f4 /system/lib64/libunwind.so
#08 pc 0000000000007618 /system/lib64/libunwind.so
#09 pc 0000000000015ca8 /system/lib64/libunwind.so (_ULaarch64_step+40)
#10 pc 0000000000006f80 /system/lib64/libbacktrace.so (_ZN13UnwindCurrent17UnwindFromContextEmP8ucontext+360)
#11 pc 0000000000004eec /system/lib64/libbacktrace.so (_ZN16BacktraceCurrent12UnwindThreadEm+556)
#12 pc 000000000048a368 /system/lib64/libart.so
(ZN3art15DumpNativeStackERNSt3_113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+200)
#13 pc 0000000000459204 /system/lib64/libart.so
(ZNK3art6Thread4DumpERNSt3_113basic_ostreamIcNS1_11char_traitsIcEEEEP12BacktraceMap+224)
#14 pc 00000000004660a4 /system/lib64/libart.so (_ZN3art14DumpCheckpoint3RunEPNS_6ThreadE+692)
#15 pc 00000000004670a0 /system/lib64/libart.so (_ZN3art10ThreadList13RunCheckpointEPNS_7ClosureE+500)
#16 pc 000000000046770c /system/lib64/libart.so (ZN3art10ThreadList4DumpERNSt3_113basic_ostreamIcNS1_11char_traitsIcEEEE+204)
#17 pc 0000000000468014 /system/lib64/libart.so
(ZN3art10ThreadList14DumpForSigQuitERNSt3_113basic_ostreamIcNS1_11char_traitsIcEEEE+492)
#18 pc 00000000004313a4 /system/lib64/libart.so
(ZN3art7Runtime14DumpForSigQuitERNSt3_113basic_ostreamIcNS1_11char_traitsIcEEEE+96)
#19 pc 000000000043e814 /system/lib64/libart.so (_ZN3art13SignalCatcher13HandleSigQuitEv+1256)
#20 pc 000000000043f424 /system/lib64/libart.so (_ZN3art13SignalCatcher3RunEPv+452)
#21 pc 0000000000067754 /system/lib64/libc.so (ZL15_pthread_startPv+52)
#22 pc 000000000001c644 /system/lib64/libc.so (__start_thread+16)

从调用栈来看,是SignalCacher线程在打印其他线程的调用栈时出现异常。

【问题分析】

先通过addr2line工具确定出问题的代码:

static int
load_debug_frame (const char *file, char **buf, size_t *bufsize, int is_local)
{
  ...

  f = fopen (file, "r");

  if (!f)
    return 1;

  if (fread (&ehdr, sizeof (Elf_W (Ehdr)), 1, f) != 1)
    goto file_error;

  shstrndx = ehdr.e_shstrndx;

  Debug (4, "opened file ‘%s‘. Section header at offset %d\n",
         file, (int) ehdr.e_shoff);

  fseek (f, ehdr.e_shoff, SEEK_SET);
  sec_hdrs = calloc (ehdr.e_shnum, sizeof (Elf_W (Shdr)));
  if (sec_hdrs == NULL || fread (sec_hdrs, sizeof (Elf_W (Shdr)), ehdr.e_shnum, f) != ehdr.e_shnum)
    goto file_error;

  Debug (4, "loading string table of size %ld\n",
       (long) sec_hdrs[shstrndx].sh_size);
  size_t sec_size = sec_hdrs[shstrndx].sh_size;  <<<

看起来是shstrndx太大,数组访问越界导致的。而

shstrndx = ehdr.e_shstrndx

这个值是从elfheader中获取的,可能是elf文件格式有问题。

通过objdump反汇编,确定这里ehdr的地址是x27值,也就是0000007f951f3338

再通过tombstone,确定这个ehdr的值为:

memory near x27:
    0000007f951f3318 0000007f8371b214 0000007f951f3bb0  ..q......;......
    0000007f951f3328 0000007f95c31000 0000007f95c31000  ................
    0000007f951f3338 0800000a04034b50 c1963a2100000000  PK..........!:..
    0000007f951f3348 3b4e00013b4e66df 7361000d001d0001  .fN;..N;......as
    0000007f951f3358 7268632f73746573 5f3030315f656d6f  sets/chrome_100_
    0000007f951f3368 2e746e6563726570 350000cafe6b6170  percent.pak....5
    0000007f951f3378 2190b2bd990eaa19 0000007f951f3470  .......!p4......

标准的elf文件,它的文件头是一个magic numbers = 7f 45 4c 46,如:

$ xxd symbols/system/bin/linker
0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
0000010: 0300 2800 0100 0000 5816 0000 3400 0000  ..(.....X...4...
0000020: a430 1800 0000 0005 3400 2000 0a00 2800  .0......4. ...(.
0000030: 2300 2000 0600 0000 3400 0000 3400 0000  #. .....4...4...
0000040: 3400 0000 4001 0000 4001 0000 0400 0000  [email protected]@.......

而上面的magic numbers是PK,这个是apk包的magic numbers。

当前被解析的时apk包,这个并不是一个elf文件,因此unwind解析时会出错。

下一步就需要找到这个elf文件。为此我们首先得找到正在被打印的目标线程。

我们可以在tombstone中搜索[vdso]就能找到这个正在被打印的线程,如:

pid: 6715, tid: 6762, name: Chrome_FileUser >>> com.android.contacts <<<
backtrace:
#00 pc 00000000000199c0 /system/lib64/libc.so (syscall+28)
#01 pc 0000000000067474 /system/lib64/libc.so
(ZL33_pthread_cond_timedwait_relativeP23pthread_cond_internal_tP15pthread_mutex_tPK8timespec+96)
#02 pc 00000000000675f0 /system/lib64/libc.so (pthread_cond_timedwait+72)
#03 pc 00000000000068bc /system/lib64/libbacktrace.so (_ZN11ThreadEntry4WaitEi+76)
#04 pc 0000000000004c3c /system/lib64/libbacktrace.so
#05 pc 00000000000004dc [vdso]
#06 pc 00000000000199bc /system/lib64/libc.so (syscall+24)
#07 pc 0000000000067474 /system/lib64/libc.so
(ZL33_pthread_cond_timedwait_relativeP23pthread_cond_internal_tP15pthread_mutex_tPK8timespec+96)
#08 pc 0000000000793214 /system/app/WebViewGoogle/WebViewGoogle.apk (offset 0xa0d000)

这里的vdso是放信号处理函数的内存段:

    ...
    0000007f‘993ae000-0000007f‘993aefff r-x         0      1000  [vdso]
    0000007f‘993af000-0000007f‘993affff r--     32000      1000  /system/bin/linker64
    0000007f‘993b0000-0000007f‘993b1fff rw-     33000      2000  /system/bin/linker64
    ...

【打印目标线程调用栈过程】

1、给目标线程发送特殊的signal,触发目标线程的信号处理函数。

2、内核调用信号处理函数时,会将当前目标线程的CPU上下文以参数的形式传给信号处理函数。这样信号处理函数中,就能得到这个上下文。

3、得到这个上下文后,当前线程就将这个上下文传给Signal Catcher线程,然后自己进入wait状态。

4、Signal Catcher线程得到这个上下文后,就可以调用unwind库,来打印目标线程的调用栈,打印完在wake目标线程。

当前的NE就是第4个阶段,也就是Signal Cacher线程拿到目标线程上下文后,再调用unwind库解析目标线程的调用栈时出的问题。

从调用栈中可以清楚的看到,是调用栈中有WebViewGoogle.apk这个文件,和之前的推理吻合。

查看WebViewGoogle.apk的内容,也和前面解析的文件头内容相同。

【解决方案】

在unwind中,读取文件头后,先判断是否有elf的magic number即可,如:

  if (fread (&ehdr, sizeof (Elf_W (Ehdr)), 1, f) != 1)
    goto file_error;

  /* Verify this is actually an elf file. */
+ if (memcmp(ehdr.e_ident, ELFMAG, SELFMAG) != 0)
+   goto file_error;

  shstrndx = ehdr.e_shstrndx;

aosp中也有相同change:

https://android-review.googlesource.com/#/c/194457/

时间: 2024-10-10 16:47:29

WebView兼容问题分析报告的相关文章

爱奇艺、优酷、腾讯视频竞品分析报告2016(二)

接上一篇<爱奇艺.优酷.腾讯视频竞品分析报告2016(一)> http://milkyqueen520.blog.51cto.com/11233158/1760192 2.4 产品设计与交互 2.4.1  视觉风格 APP设计风格从视觉效果上至少给用户传达了两个信息:一是APP的整体基调.二是APP的目标人群. 在设计风格表现上,颜色占据了80%以上的视觉体验.因此要做好设计风格,主要做好界面的颜色搭配和分布.另外颜色是有情感的,不同的色彩能给于用户不同的印象和感受,而且不同的人群对颜色偏好也

2015年8月数据安全漏洞分析报告

安华金和数据库攻防实验室(DBSec Labs)以月为单位,将高危漏洞汇总,形成分析报告,分享广大用户及合作伙伴. 8月报告核心观点 1.Web是数据泄露的主要渠道 2.互联网成为数据泄漏频发地 3.8月常见数据泄漏原因 4.针对数据泄漏的防范手段 报告正文 2015年8月,我们总结发布了102个数据泄密高危漏洞,这些漏洞分别来自漏洞盒子.乌云.补天等平台,涉及11个行业,企业机构.互联网.交通运输.教育.金融保险.旅游.能源.社保公积金.医疗卫生.运营商.政府.102个漏洞中,其中绝大多数泄露

爱奇艺、优酷、腾讯视频竞品分析报告2016(一)

1 背景 1.1 行业背景 1.1.1 移动端网民规模过半,使用时长份额超PC端 2016年1月22日,中国互联网络信息中心 (CNNIC)发布第37次<中国互联网络发展状况统计报告>,报告显示,网民的上网设备正在向手机端集中,手机成为拉动网民规模增长的主要因素.截至2015年12月,我国手机网民规模达6.20亿,有90.1%的网民通过手机上网. 图 1  2013Q1~2015Q3在线视频移动端和PC端有效使用时长份额对比 根据艾瑞网民行为监测系统iUserTracker及mUserTrac

后台数据管理分析报告.V.1.1

后台数据管理分析报告 负责人:姜敏 合伙人:任小风.贺丽霞 项目分析目标 1.项目目标:把APP后台建造完成 2.课上留的作业完成并放在博客园 3.要创建并连接数据库 4.在R中读出

中华英才网竞品分析报告2016

中华英才网竞品分析报告 1 背景 1.1 行业背景 1) 网民增速不断提升,移动端网民规模过半. 2016年1月22日,中国互联网络信息中心 (CNNIC)发布第37次<中国互联网络发展状况统计报告>.截至2015年12月,中国网民规模达6.88亿, 半数中国人已接入互联网. 其中,2015年新增网民3951万人,增长率为6.1%,较2014年提升1.1个百分点,网民规模增速有所提升. 图 1  2011-2018年中国整体网民数量及增长趋势 <报告>同时显示,网民的上网设备正在向

《亿人帮》与《新米公益》竞品分析报告(简要版)

<亿人帮>与<新米公益>竞品分析报告(简要版) --白斌 [email protected] iOS. APP版本皆为最新版 2016.12.12 竞品选择:<新米公益> 理由:都是互联网+公益,项目模式相同,两款APP均在2015年第二季度上线,SWOT四方面两者几乎是同样的起点.下面从产品的五个层次对二者进行分析并提出建议 一.战略层: 1.产品比较 产品名称 志愿者参与方式 slogan <新米公益> 走路.早起.答题 不止更好的自己 <亿人帮&

你的竞品分析报告是否有深入思考

竞品分析应该是一个长期且深入的工作.既要观察竞品的演变过程,又要能对竞品做深入的分析. 分析竞品的目的无非是,竞品是否能给到我们借鉴的作用?而竞品的迭代,也无外乎两个,用户想要的(需求),产品想要的(价值). 一. 我是怎么做竞品分析的? 首先,我做竞品的方法,一般包括以下两种.并行. 1 .选定要观察的竞品.然后,定期观察竞品是否有迭代,迭代的内容记录下来.如果有特别重要的变更,发出来进行讨论.每个月汇总一次竞品观察,邮件发送到要知悉的人. 2 .每次选择一款竞品深入地体验,做到大部分的用户流

“找出水王”分析报告

“找出水王”分析报告 一.题目要求 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 二.设计思路 1.水王的发帖数超过所有人的一半,这个是个重要信息. 2.这个就和开心消消乐一样,一对一对的把不同的id消去,剩下的一定就是水王的id. 3.因为水王的i

国际软件设计文档——测试分析报告

1 引言 1.1 编写目的 说明这份测试分析报告的具体编写目的,指出预期的阅读范围. 1.2 背景 说明: 被测试软件系统的名称: 该软件的任务提出者.开发者.用户及安装此软件的计算中心,指出测试环境与实际运行环境 之间可能存在的差异以及这些差异对测试结果的影响. 1.3 定义 列出本文件中用到的专问术语的定义和外文首字母组词的原词组. 1.4 参考资料 列出要用到的参考资料,如: a.  本项目的经核准的计划任务书或合同.上级机关的批文: b.  属于本项目的其他已发表的文件: c.  本文件