CTS问题分析4拓展-无法抓取tombstone的原因 | weiinter105

前面说到,在bionic/linker客户端以及system/core/dubuggerd服务端之间都加了相关的SIGSYS信号量处理,但还是抓不出tombstone,现查看原因。

先说结论:由于设置了信号处理函数导致的问题

简单demo类比场景

首先本地写个demo来尝试复现类似场景

tips: new project时勾选include C++ support,非常适合用于需要调用jni的简单demo

 

 

 

 

情况1

原因是这个是SIGABRT(signal 6)发送时在abort中发送了两次

 

也就是说上面的std::string test1 = NULL;会调用abort函数,发送两次信号,第一次信号被自定义的信号处理函数捕获;第二次再发送一个SIGABRT信号时,会进入默认的信号处理逻辑中,也就可以抓coredump

 

 

可见,生成了两次signal 6,第一次是有handler的,第二次handler被清零了,则相应进程就被kill了,导致crash闪退

那么为什么case进程没有立即闪退而是等到assertTrue失败了呢?在case中没有立即crash的原因是,crash的是一个Isolated Process服务

 

点击button时虽然页面没有闪退;但log中还是能看到service crash,die的信息,并且也会生成coredump

情况2

还有一种情况,首先我们将点击按钮换为:

 

对应的产生信号量和处理信号量的handler为这样时:

 

页面不会闪退,原因是通过tkill只发送了一次signal 6,被截住了,也不会生成coredump;如果想要正常crash还可以参照abort的写法,将handler改为:

 

那么也会复现上面的trace log;

回到case

我们再看case运行时的trace log:

<

 

和上面demo的trace log类似,因此抓不出tombstone的原因已经清楚了,是定义了信号处理函数,其中comm=Binder:28925_3,28925为信号发送端,pid=28943为信号接收端;且因为走到了后面默认的信号处理逻辑,因此可以通过coredump来查看

而究竟类似上面的情况一,发送端就发送了两次信号;或者情况二,定义的handler做了再次发送的信号;这个需要找到handler才能进一步确认,或者再通过demo生成SIGSYS看是否会发送两次;这就不在本章的讨论范围中了

回到demo 如何根据handler的值查看具体handler

sig=6 errno=0 code=-6 sa_handler=7f5d4967f8 sa_flags=18000004

ps | grep weijuncheng
u0_a169 20189 728 1646708 53452 SyS_epoll_ 7f7bbac540 S com.test.weijuncheng.myapplication
cat /proc/20189/maps > /sdcard/log2.log

或者cat /proc/$(pidof "com.test.weijuncheng.myapplication")/maps

得到的结果是一样的,其中

 

通过地址找到了handler

查看case的handler在/system/bin/linker64中,但是搜索相关路径没有SIGSYS字样,还是有点奇怪,且linker64不是一个so库,而是一个可执行bin文件,如何objdump?

aarch64-linux-android-objdump -D -m arm linker64 > link64.log (不要加-b)

 

首先找到handler在进程中的地址
Start proc 17173:android.os.cts/u0i56 for service android.os.cts/.SeccompTest$IsolatedService caller=android.os.cts 17188 接收进程

 

然后查找6D5C

 

但是在其中加log根本没有被调用的迹象,这个相当奇怪;为了防止计算有误,这里还将注册的SIGSYS语句注释掉重新跑了一遍,再看signal trace log

 

发现果然handler相关的log没有了;

那么问题就变为,为什么注册了信号处理函数,在trace log中也打出来了,但好像并没有执行;添加的log没打出来,且最后没有生成tombstone

总结

当信号量被注册了自定义的信号处理函数时,无法tombstone,但是可能可以获取coredump,需要具体问题具体分析了;目前的问题变为了注册了信号处理函数但不执行;这个待续,目前有两个思路 1.signal被ignore或者blocker 2.信号从内核传递到用户态的信号处理函数时出现了问题,待进一步分析

作者: RESSRC

个人资源站

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据