CTS/GTS问题分析4 | weiinter105

问题初探

测试命令:
run cts -m CtsOsTestCases -t android.os.cts.SeccompTest#testIsolatedServicePolicy

报错堆栈:
07-24 00:50:08.627 2633 4112 I ActivityManager: Process android.os.cts (pid 13402) has died: vis SF
07-24 00:50:08.627 2022 2022 I Zygote : Process 13402 exited due to signal (31)
07-24 00:50:08.627 13379 13399 I TestRunner: failed: testIsolatedServicePolicy(android.os.cts.SeccompTest)

07-24 00:50:08.627 13379 13399 I TestRunner: ----- begin exception -----
07-24 00:50:08.628 2633 4112 I AutoStartManagerService: MIUILOG- Reject RestartService packageName :android.os.cts uid : 10148
07-24 00:50:08.628 5696 5801 D PowerKeeper.Event: notifyAMProcDied pacakageName: android.os.cts, pid:13402
07-24 00:50:08.628 13379 13399 I TestRunner: android.os.DeadObjectException

关键在Process 13402 exited due to signal (31) 由于产生了signal 31导致的问题,导致测试进程被杀死,signal 31代表SIGSYS,即调用了bad system call导致了case fail,但是抓了bugreport里面没有tombstone,看不到堆栈,找不到调用了什么syscall,以及哪里调用了syscall导致的问题

测试期间打开tracing_on,执行:

echo 1 > /d/tracing/events/signal/enable
echo 1 > /d/tracing/tracing_on
cat trace_pipe
echo 0 > /d/tracing/tracing_on

 

08-01 22:05:17.549 2342 5098 I ActivityManager: Start proc 14381:android.os.cts/u0i1 for service android.os.cts/.SeccompTest$IsolatedService caller=android.os.cts

关键点:一个测试case会引发两个进程,其中一个测试进程发出sig=31,导致测试进程android.os.cts被杀死,程序退出,但是这也只能证明确实是signal 31造成的影响,看不到进一步的信息

问题分析

但是还是看不到上面的调用栈,首先在seccomp_send_sigsys加log

 

 

这样只能看到内核栈,不过更进一步了,看到应该是syscall = 120造成的错误,但是这样还是不太有用,必须要对SIGSYS信号有所响应,将调用栈完整的抓出来才行

那么首先想到的是模仿其他信号,注册SISGSYS信号,在tombstone中打出信息
http://gerrit.pt.miui.com/#/c/357188/
http://gerrit.pt.miui.com/#/c/357196/
用了如上两条change(system/core/debuggerd & bionic/linker),不起作用,原因参考tombstone与debuggerd相关流程;CTS问题分析4拓展-无法抓取tombstone的原因

但是又发现SIGSYS信号是能响应coredump的

 

那么简单了,直接抓coredump就行了

 

运行一遍测试,将/data/core里面的coredump取出来

然后按照下面的步骤操作
1.在http://eng.pt.miui.com/?r=eng&dir=/symbols下载对应rom的symbols,并解压到本地;
2.执行gdb,gdb在rom源码中(prebuilts/gdb/linux-x86/bin/gdb)可找到,执行 源码根目录/prebuilts/gdb/linux-x86/bin/gdb ./gdb
3.加载app_process执行程序,若为32位应用则加载app_process32,64位应用加载app_process64, 该可执行程序位于下载的symbols中, 在gdb中执行:
(gdb) file out/target/product/****/symbols/system/bin/app_process32
4.加载coredump,在gdb中执行:
(gdb) core !system!bin!app_process32.5358.dboxed_process0
5.设置symbols,在gdb中执行:
(gdb) set sysroot out/target/product/sagit/symbols/
6.此时debug环境已经搭建好,可以通过gdb来debug native crash

 

这样调用栈就已经很明显了,调用thread.sleep时因为性能打点调用了syscall(sched_getscheduler)造成的问题

问题总结

生成tombstone的信号集和coredump的信号集不一样,前者是后者的子集;

问题拓展

调研为什么修改代码后tombstone不生成的原因

首先运行一遍测试,signal trace log如下:

 

最终还是走到了信号的默认处理流程,生成coredump

根据sa_handler=7f7cd89d5c,在运行时通过cat /proc/$(pidof "android.os.cts")/maps找到

 

信号处理函数在linker64中,再通过odjdump出其汇编代码,计算得到相关的handler,结果发现就是debuggerd_signal_handler

 

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

 

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

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

作者: RESSRC

个人资源站

发表评论

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

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