Socket阻塞导致的system_server无法正常启动分析

本文详细分析了在Monkey测试过程中遇到的system server无法正常启动的问题,发现原因是Socket阻塞。具体表现为system server在启动NetworkManagementService时因未能成功连接netd,netd进程在执行iptables命令时持有文件锁导致block。进一步排查发现,dumpstate进程在创建iptables进程时写入socket数据时block,最终定位到是多个bugreport进程同时尝试连接dumpstate,导致管道buffer满,无法读写,从而引发连锁阻塞问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章主要记录分析monkey出现的一个system server无法正常启动问题

注:文章分析过程比较长,阅读分析过程前,可以先参考文章末尾的问题主线图

Socket原理
 socket原理

Pipe原理
pipe原理

分析工具
分析方法
问题现象

  设备跑monkey过程中system server重启,但是没有成功启动,system server被block,出现卡白米的现象。

问题分析

  首先看看system server main线程当前的状态:

"main" prio=5 tid=1 Waiting
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x75b72710 self=0x7ed70c2a00
  | sysTid=22740 nice=-2 cgrp=default sched=0/0 handle=0x7f5bcaa9a8
  | state=S schedstat=( 2377978501 402005404 2887 ) utm=174 stm=63 core=2 HZ=100
  | stack=0x7fed985000-0x7fed987000 stackSize=8MB
  | held mutexes=
  at java.lang.Object.wait(Native method)
  - waiting on <0x053add86> (a java.lang.Object)
  at java.lang.Thread.parkFor$(Thread.java:2137)
  - locked <0x053add86> (a java.lang.Object)
  at sun.misc.Unsafe.park(Unsafe.java:358)
  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:190)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:868)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1021)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1328)
  at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:232)
  at com.android.server.NetworkManagementService.create(NetworkManagementService.java:377)
  at com.android.server.NetworkManagementService.create(NetworkManagementService.java:386)
  at com.android.server.SystemServer.startOtherServices(SystemServer.java:1070)
  at com.android.server.SystemServer.run(SystemServer.java:407)
  at com.android.server.SystemServer.main(SystemServer.java:283)
  at java.lang.reflect.Method.invoke(Native method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:801)

  从打印出的栈信息来看,system server正在启动NetworkManagementService,并且在等待一个CountDownLatch的完成,那么这个需要等待的任务是什么呢?

private class NetdCallbackReceiver implements INativeDaemonConnectorCallbacks {
   
   
    @Override
    public void onDaemonConnected() {
        Slog.i(TAG, "onDaemonConnected()");
        // event is dispatched from internal NDC thread, so we prepare the
        // daemon back on main thread.
        if (mConnectedSignal != null) {
            // The system is booting and we're connecting to netd for the first time.
            mConnectedSignal.countDown();
            mConnectedSignal = null;
        } 
        // ...
    }
    // ...
}

  当NetworkManagementService create的时候,会创建一个NativeDaemonConnector并与netd通过socket进行连接,只有socket连接建立完成,NetworkManagementService才算真正创建完成。而这里,显然是因为与netd之间的socket一直没有创建成功才导致的等待。

02-04 08:42:05.532  1000 22740 22900 E NetdConnector: Communications error: java.io<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值