一、关键字:

拨打电话,无法拨通电话。

二、问题描述

设备型号:开发者手机2代机

系统版本:OpenHarmony 5.0

代码版本:OpenHarmony-5.0.0-Release

问题现象:设备插入SIM卡,拨打电话134xxxxxxxx,弹出通话的界面,但无法拨通对端电话。

三、原因分析

分析代码,排查流程,发现阻塞在如下位置

在157行中流程堵塞在这里

继续跟踪,发现阻塞1355行的SetMute()函数

继续跟踪代码,发现阻塞在162行的GetHandler()函数

在GetHandler()函数中,发现1282行申请锁的位置阻塞,程序在这里卡住。

分析这里,程序堵塞在这里卡住,应该是发生死锁,导致堵塞。

如果是发生死锁,那么肯定有其他地方一致持有锁没有释放

查看代码中所有handlerMapMutex_持有锁的代码

可以看到handlerMapMutex_持有锁一共有5处,加入打印分析哪里持有锁。

发现在RegisterCoreServiceHandler()函数中持有锁,没有释放。

加入打印,分析代码,分析为什么没有释放锁

第200行:锁住

第228行:在GetDomainPreferenceMode()函数中又申请了handlerMapMutex_,这里发生死锁。

第231行:解锁

GetDomainPreferenceMode()函数中,调用GetHandler()函数,会又申请了handlerMapMutex_锁

在GetHandler()函数中,申请handlerMapMutex_锁发生死锁

结论

在RegisterCoreServiceHandler()函数中发生死锁导致

RegisterCoreServiceHandler()     ---申请handlerMapMutex_锁,锁住

  --->GetDomainPreferenceMode()

​    --->GetDomainPreferenceModeRequest()

​       --->GetHandler()                     ---申请handlerMapMutex_锁,死锁

四、解决方案

在RegisterCoreServiceHandler()函数中,在GetDomainPreferenceMode()函数前解锁,这样就不会发生死锁的问题。

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐