CTS问题分析4

CTS/GTS问题分析4

问题初探

测试命令:
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

<...>-14399 [001] d..2 923.002473: signal_generate: sig=31 errno=1 code=458753 comm=Binder:14381_3 pid=14399 grp=0 res=0
<...>-14399 [001] d..2 923.002511: signal_deliver: sig=31 errno=1 code=458753 sa_handler=0 sa_flags=0
<...>-14381 [000] d..2 923.002953: signal_deliver: sig=9 errno=0 code=0 sa_handler=0 sa_flags=0

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

static void seccomp_send_sigsys(int syscall, int reason)
{
    struct siginfo info;
    memset(&info, 0, sizeof(info));
    info.si_signo = SIGSYS;
    info.si_code = SYS_SECCOMP;
    info.si_call_addr = (void __user *)KSTK_EIP(current);
    info.si_errno = reason;
    info.si_arch = syscall_get_arch();
    info.si_syscall = syscall;
    printk("syscall = %d",syscall);
    dump_stack();
}
<4>[ 560.550830] syscall = 120 
<4>[ 560.550888] CPU: 2 PID: 13457 Comm: Binder:13442_2 Tainted: G W O 3.18.31-perf-g23a16ea #1
<4>[ 560.550912] Hardware name: Qualcomm Technologies, Inc. MSM8953 QRD SKU3 (DT)
<0>[ 560.550927] Call trace:
<4>[ 560.550961] [<ffffffc00008a028>] dump_backtrace+0x0/0x24c
<4>[ 560.550981] [<ffffffc00008a294>] show_stack+0x20/0x28
<4>[ 560.551003] [<ffffffc000dca008>] dump_stack+0x80/0xa4
<4>[ 560.551025] [<ffffffc000142c84>] seccomp_send_sigsys+0xbc/0x104
<4>[ 560.551042] [<ffffffc0001436a4>] seccomp_phase1+0x154/0x22c
<4>[ 560.551060] [<ffffffc000143870>] __secure_computing+0x18/0x40
<4>[ 560.551081] [<ffffffc000088d20>] syscall_trace_enter+0x44/0x1e8

这样只能看到内核栈,不过更进一步了,看到应该是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的

#define sig_kernel_coredump(sig)    siginmask(sig, SIG_KERNEL_COREDUMP_MASK)
 
431#define SIG_KERNEL_COREDUMP_MASK (\
432        rt_sigmask(SIGQUIT)   |  rt_sigmask(SIGILL)    | \
433 rt_sigmask(SIGTRAP)   |  rt_sigmask(SIGABRT)   | \
434        rt_sigmask(SIGFPE)    |  rt_sigmask(SIGSEGV)   | \
435 rt_sigmask(SIGBUS)    |  rt_sigmask(SIGSYS)    | \
436        rt_sigmask(SIGXCPU)   |  rt_sigmask(SIGXFSZ)   | \
437 SIGEMT_MASK

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

adb shell setprop persist.debug.trace 1
adb shell setenforce 0

运行一遍测试,将/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

(gdb) bt
#0 sched_getscheduler () at bionic/libc/arch-arm64/syscalls/sched_getscheduler.S:9
#1 0x0000007f9d641d2c in android::os::statistics::PerfEventReporter::beginReportPerfEvent (env=env@entry=0x7f91c1c900, threadPriorityInfo=...)
at out/target/product/mido/obj/SHARED_LIBRARIES/libandroid_runtime_intermediates/android/os/statistics/PerfEventReporter.cpp:60
#2 0x0000007f9d642b10 in android::os::statistics::reportConditionSatisfied (env=0x7f91c1c900, monitorId=548042869504, awakenReason=1, beginUptimeMs=<optimized out>, endUptimeMs=<optimized out>)
at out/target/product/mido/obj/SHARED_LIBRARIES/libandroid_runtime_intermediates/android/os/statistics/JavaVMSupervisionCallBacks.cpp:317
#3 0x0000007f99b53ee8 in art::Monitor::ReportConditionSatisfied (self=0x7f91c35c00, monitor=<optimized out>, wait_awaken_ms=553640, wait_start_ms=<optimized out>, awaken_reason=<optimized out>) at art/runtime/monitor.cc:439
#4 art::Monitor::Wait (this=<optimized out>, self=<optimized out>, ms=<optimized out>, ns=<optimized out>, interruptShouldThrow=<optimized out>, why=art::kWaiting) at art/runtime/monitor.cc:1018
#5 0x000000007060d84c in java.lang.Thread.sleep () from /home/weijuncheng/cts/第五十八周/HQ-23018/out/target/product/mido/symbols/system/framework/arm64/boot.oat
#6 0x000000007060d688 in java.lang.Thread.sleep () from /home/weijuncheng/cts/第五十八周/HQ-23018/out/target/product/mido/symbols/system/framework/arm64/boot.oat
#7 0x000000007060d294 in java.lang.Thread.sleep () from /home/weijuncheng/cts/第五十八周/HQ-23018/out/target/product/mido/symbols/system/framework/arm64/boot.oat
#8 0x0000007f998acaec in art_quick_invoke_static_stub () at art/runtime/arch/arm64/quick_entrypoints_arm64.S:1542
#9 0x0000007f998b9534 in art::ArtMethod::Invoke (this=0x6f520180, self=0x7f91c35c00, args=0x7f920d9a04, args_size=8, result=0x7f920d9bf8, shorty=0x702c1dc4 <oatdata+3218884> "VJ") at art/runtime/art_method.cc:291
#10 0x0000007f99a67c44 in art::interpreter::ArtInterpreterToCompiledCodeBridge (self=0x7f91c35c00, caller=0x7f8c5242c8, code_item=0x700939c0 <oatdata+932288>, shadow_frame=0x7f920d99c0, result=0x7f920d9bf8)
at art/runtime/interpreter/interpreter_common.cc:538f

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

问题总结

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

问题拓展

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

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

Binder:28925_3-28943 [002] d..2 83514.980997: signal_generate: sig=31 errno=1 code=458753 comm=Binder:28925_3 pid=28943 grp=0 res=0
Binder:28925_3-28943 [002] d..2 83514.981028: signal_deliver: sig=31 errno=1 code=458753 sa_handler=7f7cd89d5c sa_flags=18000004
Binder:28925_3-28943 [002] d..2 83514.981146: signal_generate: sig=31 errno=1 code=458753 comm=Binder:28925_3 pid=28943 grp=0 res=0
Binder:28925_3-28943 [002] d..2 83514.981154: signal_deliver: sig=31 errno=1 code=458753 sa_handler=0 sa_flags=10000000

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

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

7f7cd83000-7f7ce2c000 r-xp 00000000 b3:18 749 /system/bin/linker64
7f7ce2c000-7f7ce2d000 r--p 00000000 00:00 0 [anon:atexit handlers]
7f7ce2d000-7f7ce30000 r--p 000a9000 b3:18 749 /system/bin/linker64
7f7ce30000-7f7ce31000 rw-p 000ac000 b3:18 749 /system/bin/linker64

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

0000000000006d5c <__dl__ZL24debuggerd_signal_handleriP7siginfoPv>:
6d5c: a9bb67fa ldmibge fp!, {r1, r3, r4, r5, r6, r7, r8, r9, sl, sp, lr}
6d60: a9015ff8 stmdbge r1, {r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}
6d64: a90257f6 stmdbge r2, {r1, r2, r4, r5, r6, r7, r8, r9, sl, ip, lr}
6d68: a9034ff4 stmdbge r3, {r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
6d6c: a9047bfd stmdbge r4, {r0, r2, r3, r4, r5, r6, r7, r8, r9, fp, ip, sp, lr}

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

Binder:7495_3-7514 [000] d..2 198.369068: signal_generate: sig=31 errno=1 code=458753 comm=Binder:7495_3 pid=7514 grp=0 res=0
Binder:7495_3-7514 [000] d..2 198.369097: signal_deliver: sig=31 errno=1 code=458753 sa_handler=0 sa_flags=0
<...>-7510 [005] d..2 198.369218: signal_deliver: sig=9 errno=0 code=0 sa_handler=0 sa_flags=0
Signal Catcher-7501 [000] d..2 198.369230: signal_deliver: sig=9 errno=0 code=0 sa_handler=0 sa_flags=0

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容