Telephony无法拨打电话的问题分析
一、关键字:
拨打电话,无法拨通电话。
二、问题描述
设备型号:开发者手机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()函数前解锁,这样就不会发生死锁的问题。

更多推荐

所有评论(0)