应用Binder线程耗尽导致systemserver anr并重启问题

本文对SystemServer ANR最终导致重启问题进行分析,涉及bugreport、BinderTrace、WDT等文件。从bugreport找到kill system_server关键字,得知进程因Binder IO block被杀;从BinderTraces查看进程相关transaction信息;从WDT文件发现binder耗尽,卡在QtiSimPhoneBookAdnRecordCache.java:149,最后可根据详情修改。

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

SystemServer ANR 最终导致重启的分析

涉及文件:
1 bugreport
2 BinderTrace
3 WDT

AA :
从Bugreport中找到kill system_server的关键字,如下:

W Watchdog: *** WATCHDOG KILLING SYSTEM PROCESS: Blocked in handler on i/o thread (android.io)
06-27 09:41:10.844  1000   894  1788 W Watchdog: i/o thread stack trace:
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at android.os.BinderProxy.transactNative(Native Method)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at android.os.BinderProxy.transact(Binder.java:789)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at com.android.internal.telephony.ITelephony$Stub$Proxy.getTetherApnRequired(ITelephony.java:4099)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at android.telephony.TelephonyManager.getTetherApnRequired(TelephonyManager.java:4968)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at com.android.server.connectivity.tethering.TetheringConfiguration.checkDunRequired(TetheringConfiguration.java:189)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at com.android.server.connectivity.tethering.TetheringConfiguration.<init>(TetheringConfiguration.java:100)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at com.android.server.connectivity.Tethering.updateConfiguration(Tethering.java:263)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at com.android.server.connectivity.Tethering.-wrap13(Unknown Source:0)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at com.android.server.connectivity.Tethering$StateReceiver.onReceive(Tethering.java:809)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_52497(LoadedApk.java:1320)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.$m$7(Unknown Source:4)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.run(Unknown Source:39)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at android.os.Handler.handleCallback(Handler.java:790)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at android.os.Handler.dispatchMessage(Handler.java:99)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at android.os.Looper.loop(Looper.java:171)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at android.os.HandlerThread.run(HandlerThread.java:65)
06-27 09:41:10.844  1000   894  1788 W Watchdog:     at com.android.server.ServiceThread.run(ServiceThread.java:46)
06-27 09:41:10.844  1000   894  1788 W Watchdog: *** GOODBYE!

查看进程被杀原因:Binder IO block导致,那么接下来需要追查system_server正在跟谁进行binder通讯

BB :
从BinderTraces文件中查看进程894 相关transaction相关信息,如下:

    Line 3092:   pending transaction 6820434: ffffffe2bb9a6d80 from 894:1080 to 1854:0 code 17 flags 10 pri 0:130 r1 node 12820 size 80:0 data ffffff8026005438
    Line 3094:   pending transaction 6820815: ffffffe202187a80 from 894:1162 to 1854:0 code 61 flags 10 pri 0:120 r1 node 14448 size 92:0 data ffffff8026005758
    Line 3108:   pending transaction 6821061: ffffffe262236980 from 894:3197 to 1854:0 code 14 flags 10 pri 0:120 r1 node 12820 size 80:0 data ffffff8026006318
    Line 3109:   pending transaction 6821064: ffffffe262236700 from 894:1792 to 1854:0 code 6 flags 10 pri 0:120 r1 node 12820 size 100:0 data ffffff80260063c0
    Line 3148:   pending transaction 6824766: ffffffe2623b3e80 from 894:1547 to 1854:0 code 6 flags 10 pri 0:112 r1 node 12820 size 100:0 data ffffff8026009ff8
    Line 3149:   pending transaction 6827279: ffffffe24d98fe00 from 894:1582 to 1854:0 code 14 flags 10 pri 0:120 r1 node 12820 size 80:0 data ffffff802600b7d8
    Line 8842:     outgoing transaction 6820434: ffffffe2bb9a6d80 from 894:1080 to 1854:0 code 17 flags 10 pri 0:130 r1
    Line 8848:     outgoing transaction 6820815: ffffffe202187a80 from 894:1162 to 1854:0 code 61 flags 10 pri 0:120 r1
    Line 8858:     outgoing transaction 6824766: ffffffe2623b3e80 from 894:1547 to 1854:0 code 6 flags 10 pri 0:112 r1
    Line 8866:     outgoing transaction 6827279: ffffffe24d98fe00 from 894:1582 to 1854:0 code 14 flags 10 pri 0:120 r1
    Line 8874:     outgoing transaction 6821064: ffffffe262236700 from 894:1792 to 1854:0 code 6 flags 10 pri 0:120 r1
    Line 8887:     outgoing transaction 6821061: ffffffe262236980 from 894:3197 to 1854:0 code 14 flags 10 pri 0:120 r1
    Line 11051:     incoming transaction 6827914: ffffffe22b82b400 from 894:1497 to 794:1495 code 4 flags 10 pri 1:89 r1 node
    
可以看到894正在跟1854通讯,


Tips:
pending transaction: 记录当前所有进程和线程 TODO队列的transaction.
outgoing transaction: 当前线程transaction_stack, 由该线程发出的事务;
incoming transaction: 当前线程transaction_stack, 由需要线程接收的事务;
pending transactions: 记录当前进程总的pending事务;

CC :
从WDT文件中查看Binder:1854_相关信息,如下:

"Binder:1854_1" prio=5 tid=8 Blocked
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x14801768 self=0x7212c14400
  | sysTid=1875 nice=0 cgrp=default sched=0/0 handle=0x72038d74f0
  | state=S schedstat=( 13768917056 19184339770 80523 ) utm=843 stm=533 core=0 HZ=100
  | stack=0x72037dd000-0x72037df000 stackSize=1005KB
  | held mutexes=
  at com.qualcomm.qti.internal.telephony.QtiIccPhoneBookInterfaceManager.getAdnRecordsInEf(QtiIccPhoneBookInterfaceManager.java:90)
  - waiting to lock <0x02e2601a> (a java.lang.Object) held by thread 40
  at com.android.internal.telephony.UiccPhoneBookController.getAdnRecordsInEfForSubscriber(UiccPhoneBookController.java:123)
  at com.android.internal.telephony.IccProvider.loadFromEf(IccProvider.java:430)
  at com.android.internal.telephony.IccProvider.query(IccProvider.java:104)
  at android.content.ContentProvider.query(ContentProvider.java:1105)
  at android.content.ContentProvider.query(ContentProvider.java:1197)
  at android.content.ContentProvider$Transport.query(ContentProvider.java:247)
  at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:102)
  at android.os.Binder.execTransact(Binder.java:708)
  
  
  。。。。。。
  。。。。。。



"Binder:1854_7" prio=5 tid=40 Waiting
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x14804270 self=0x7212ceb400
  | sysTid=2970 nice=0 cgrp=default sched=0/0 handle=0x72004524f0
  | state=S schedstat=( 13309285438 19466662160 79302 ) utm=740 stm=590 core=4 HZ=100
  | stack=0x7200358000-0x720035a000 stackSize=1005KB
  | held mutexes=
  at java.lang.Object.wait(Native method)
  - waiting on <0x0c573241> (a java.lang.Object)
  at com.qualcomm.qti.internal.telephony.uicccontact.QtiSimPhoneBookAdnRecordCache.queryAdnRecord(QtiSimPhoneBookAdnRecordCache.java:149)
  at com.qualcomm.qti.internal.telephony.uicccontact.QtiSimPhoneBookAdnRecordCache.requestLoadAllAdnLike(QtiSimPhoneBookAdnRecordCache.java:177)
  - locked <0x0c573241> (a java.lang.Object)
  at com.qualcomm.qti.internal.telephony.QtiIccPhoneBookInterfaceManager.getAdnRecordsInEf(QtiIccPhoneBookInterfaceManager.java:98)
  - locked <0x02e2601a> (a java.lang.Object)
  at com.android.internal.telephony.UiccPhoneBookController.getAdnRecordsInEfForSubscriber(UiccPhoneBookController.java:123)
  at com.android.internal.telephony.IccProvider.loadFromEf(IccProvider.java:430)
  at com.android.internal.telephony.IccProvider.query(IccProvider.java:104)
  at android.content.ContentProvider.query(ContentProvider.java:1105)
  at android.content.ContentProvider.query(ContentProvider.java:1197)
  at android.content.ContentProvider$Transport.query(ContentProvider.java:247)
  at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:102)
  at android.os.Binder.execTransact(Binder.java:708)
  
  。。。。。。
  。。。。。。
  
  "Binder:1854_F" prio=5 tid=63 Blocked
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x13f80e10 self=0x720206aa00
  | sysTid=7468 nice=0 cgrp=default sched=0/0 handle=0x71fd9eb4f0
  | state=S schedstat=( 14860937747 20246234650 84331 ) utm=866 stm=620 core=3 HZ=100
  | stack=0x71fd8f1000-0x71fd8f3000 stackSize=1005KB
  | held mutexes=
  at com.qualcomm.qti.internal.telephony.QtiIccPhoneBookInterfaceManager.getAdnRecordsInEf(QtiIccPhoneBookInterfaceManager.java:90)
  - waiting to lock <0x02e2601a> (a java.lang.Object) held by thread 40
  at com.android.internal.telephony.UiccPhoneBookController.getAdnRecordsInEfForSubscriber(UiccPhoneBookController.java:123)
  at com.android.internal.telephony.IccProvider.loadFromEf(IccProvider.java:430)
  at com.android.internal.telephony.IccProvider.query(IccProvider.java:104)
  at android.content.ContentProvider.query(ContentProvider.java:1105)
  at android.content.ContentProvider.query(ContentProvider.java:1197)
  at android.content.ContentProvider$Transport.query(ContentProvider.java:247)
  at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:102)
  at android.os.Binder.execTransact(Binder.java:708)

可以看到1854的16个binder全部耗尽了,并且都held by thread 40,
可以看到tid=40正在Waitting,通过callStack可以看到卡在QtiSimPhoneBookAdnRecordCache.java:149中
然后根据详情做相关修改即可


 

<think>好的,我现在需要帮助用户解决CDRX未配置和binder堆栈异常导致radio重启问题。首先,我要回顾用户之前的提问和我的回答,确保这次回答一致且准确。用户提到参考了三个引用,但其中引用[1]和[2]关于CDRX,而引用[3]是CoreDraw的问题,可能不相关。用户当前的问题是CDRX未配置和binder堆栈异常导致radio重启,需要解决方案。 首先,我需要拆解问题,分为CDRX未配置和binder堆栈异常两部分,这两者可能导致radio模块重启。用户可能是在Android或通信模块开发中遇到这些问题,尤其是在NR(5G)相关的设备或模块中。 针对CDRX未配置的问题,根据引用[1]和[2],R16和R17的CDRX有增强的功能,比如DCP WUS、CSI/SRS优化,以及UE可以上报preferred C-DRX周期。如果CDRX未正确配置,可能导致设备无法进入节能模式,增加功耗,甚至影响网络稳定性。解决方案可能需要检查网络侧的配置,确保RRC连接重配置消息包含正确的CDRX参数,同时检查UE的Assistance Information是否正确上报。 然后是binder堆栈异常。Binder在Android中用于进程间通信,如果堆栈异常,可能导致服务崩溃,radio模块重启。常见原因包括Binder驱动错误、资源泄漏、跨进程调用超时或死锁。需要分析日志,尤其是Binder相关错误,检查是否有transaction失败或内存泄漏。 用户提到的radio重启可能由这两者共同导致:CDRX未配置导致设备功耗或网络问题,而binder异常导致通信失败,进而触发radio模块重启。 接下来,我需要组织解决方案的结构,分步骤处理每个问题结合日志分析、代码检查等方法。可能需要指导用户抓取相关日志(如RRC配置消息、Binder错误日志),检查代码中的资源释放情况,使用工具进行堆栈分析,以及建议的配置修改或补丁应用。 同时,需要验证这些方案是否可行,例如确保CDRX配置的正确性,测试Binder调用的稳定性,避免内存泄漏。可能还需要参考Android源码或相关通信协议文档,确保建议的准确性。 最后,生成相关问题,帮助用户进一步排查,比如如何抓取RRC日志,分析Binder事务,或使用调试工具。需要确保回答结构清晰,步骤明确,参考之前的引用但重点放在用户当前的问题上。</think>### **解决 CDRX 未配置与 Binder 堆栈异常导致 Radio 重启的综合方案** --- #### **1. CDRX 未配置问题分析与解决** CDRX(Connected Mode Discontinuous Reception)未配置可能导致设备无法正常进入低功耗状态,引发基带芯片(Radio)异常发热或资源冲突,最终触发重启。 ##### **1.1 验证网络侧 CDRX 配置** 1. **检查 RRC 连接重配置消息** - 通过抓取空口日志(如 QXDM/QCAT),确认网络是否下发 CDRX 配置参数。 - **关键字段**: ``` RRCConnectionReconfiguration → measConfig → csi-ReportConfig → cdrx-Config ``` 若未包含 `cdrx-Config`,表明网络未启用 CDRX 功能[^2]。 2. **UE 主动上报偏好周期**(R16 特性) - 若网络未配置 CDRX,可通过 `UEAssistanceInformation` 消息建议周期: ```cpp // 示例:UE 上报期望的 CDRX 周期(如 320ms) UEAssistanceInformation-r16 ::= SEQUENCE { cdrx-Preference-r16 CHOICE { requestedCDRX-Config-r16 DRX-Config-r16 } } ``` **注意**:需基带芯片和网络同时支持 R16 协议[^1]。 ##### **1.2 本地配置强制生效(调试用)** - 在设备端修改基带参数(需 Root 权限或工程模式): ```bash adb shell settings put global cdrx_force_enable 1 adb shell settings put global cdrx_cycle_length 320 # 单位:ms ``` **风险**:可能引发网络兼容性问题,需与运营商协调测试。 --- #### **2. Binder 堆栈异常问题定位与修复** Binder 异常通常由跨进程通信(IPC)超时、资源泄漏或内存溢出引发,导致 Radio 进程(如 `rild` 或 `modem_control`)崩溃重启。 ##### **2.1 关键日志分析** 1. **抓取 Binder 事务错误**: - 过滤 `logcat` 中 Binder 相关错误: ```bash adb logcat | grep -E "Binder|DeadObjectException|TransactionFailedException" ``` - **典型错误**: ```logcat E Binder : *** Transaction failed (code -32) E AndroidRuntime: android.os.DeadObjectException: Transaction failed on small parcel ``` 表明 Binder 通信因堆栈异常中断[^3]。 2. **检查 Radio 服务状态**: - 查看 `dumpsys activity services com.android.phone`,确认 `TelephonyRegistry` 或 `ImsService` 是否频繁重启。 ##### **2.2 代码层修复方案** 1. **避免同步 Binder 调用阻塞**: - 修改跨进程调用为异步模式(如 `AIDL oneway` 修饰符): ```java interface IRadioService { oneway void sendCommand(in byte[] data); } ``` **作用**:防止主线程阻塞导致 Transaction 超时。 2. **修复内存泄漏**: - 使用 `Android Profiler` 监控 Radio 进程内存,重点检查 `BinderProxy` 和 `Parcel` 对象的释放: ```java Parcel data = Parcel.obtain(); try { // 执行 Binder 调用 } finally { data.recycle(); // 必须回收 } ``` 3. **调整 Binder 内核参数**(需 Root): - 增大 Binder 内存缓冲区和线程数: ```bash echo 32 > /sys/module/binder/parameters/debug_mask echo 4 > /sys/module/binder/parameters/max_threads ``` --- #### **3. 联合问题排查流程** | 步骤 | 操作 | 工具/命令 | |------|------|-----------| | 1 | 确认 CDRX 配置状态 | QXDM 抓取 RRC 重配置消息 | | 2 | 检查 Binder 事务错误 | `adb logcat` + `dmesg` | | 3 | 复现 Radio 重启场景 | 模拟高负载 IPC 调用 | | 4 | 验证修复方案 | 内存分析工具(Perfetto) | --- ### **相关问题** 1. 如何通过 QXDM 工具抓取 NR CDRX 配置参数? 2. Android Binder 通信超时的根本原因有哪些? 3. 如何调试基带芯片因低功耗配置异常导致重启? [^1]: 3GPP TS 38.331 R16, "CDRX Configuration in RRC Connection Reconfiguration". [^2]: 高通文档, "NR CDRX Log Analysis with QCAT". [^3]: AOSP 源码, `Binder.cpp` 事务异常处理逻辑.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值